aboutsummaryrefslogtreecommitdiff
path: root/externals/dynarmic/tests/A64/verify_unicorn.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'externals/dynarmic/tests/A64/verify_unicorn.cpp')
-rw-r--r--externals/dynarmic/tests/A64/verify_unicorn.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/externals/dynarmic/tests/A64/verify_unicorn.cpp b/externals/dynarmic/tests/A64/verify_unicorn.cpp
new file mode 100644
index 0000000000..5ffe4f15b0
--- /dev/null
+++ b/externals/dynarmic/tests/A64/verify_unicorn.cpp
@@ -0,0 +1,80 @@
+/* This file is part of the dynarmic project.
+ * Copyright (c) 2018 MerryMage
+ * SPDX-License-Identifier: 0BSD
+ */
+
+#include <array>
+
+#include <catch2/catch_test_macros.hpp>
+
+#include "../rand_int.h"
+#include "../unicorn_emu/a64_unicorn.h"
+#include "./testenv.h"
+
+using namespace Dynarmic;
+
+TEST_CASE("Unicorn: Sanity test", "[a64]") {
+ A64TestEnv env;
+
+ env.code_mem.emplace_back(0x8b020020); // ADD X0, X1, X2
+ env.code_mem.emplace_back(0x14000000); // B .
+
+ constexpr A64Unicorn::RegisterArray regs{
+ 0, 1, 2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0};
+
+ A64Unicorn unicorn{env};
+
+ unicorn.SetRegisters(regs);
+ unicorn.SetPC(0);
+
+ env.ticks_left = 2;
+ unicorn.Run();
+
+ REQUIRE(unicorn.GetRegisters()[0] == 3);
+ REQUIRE(unicorn.GetRegisters()[1] == 1);
+ REQUIRE(unicorn.GetRegisters()[2] == 2);
+ REQUIRE(unicorn.GetPC() == 4);
+}
+
+TEST_CASE("Unicorn: Ensure 0xFFFF'FFFF'FFFF'FFFF is readable", "[a64]") {
+ A64TestEnv env;
+
+ env.code_mem.emplace_back(0x385fed99); // LDRB W25, [X12, #0xfffffffffffffffe]!
+ env.code_mem.emplace_back(0x14000000); // B .
+
+ A64Unicorn::RegisterArray regs{};
+ regs[12] = 1;
+
+ A64Unicorn unicorn{env};
+
+ unicorn.SetRegisters(regs);
+ unicorn.SetPC(0);
+
+ env.ticks_left = 2;
+ unicorn.Run();
+
+ REQUIRE(unicorn.GetPC() == 4);
+}
+
+TEST_CASE("Unicorn: Ensure is able to read across page boundaries", "[a64]") {
+ A64TestEnv env;
+
+ env.code_mem.emplace_back(0xb85f93d9); // LDUR W25, [X30, #0xfffffffffffffff9]
+ env.code_mem.emplace_back(0x14000000); // B .
+
+ A64Unicorn::RegisterArray regs{};
+ regs[30] = 4;
+
+ A64Unicorn unicorn{env};
+
+ unicorn.SetRegisters(regs);
+ unicorn.SetPC(0);
+
+ env.ticks_left = 2;
+ unicorn.Run();
+
+ REQUIRE(unicorn.GetPC() == 4);
+}