/ tests / A64 / verify_unicorn.cpp
verify_unicorn.cpp
 1  /* This file is part of the dynarmic project.
 2   * Copyright (c) 2018 MerryMage
 3   * SPDX-License-Identifier: 0BSD
 4   */
 5  
 6  #include <array>
 7  
 8  #include <catch2/catch_test_macros.hpp>
 9  
10  #include "../rand_int.h"
11  #include "../unicorn_emu/a64_unicorn.h"
12  #include "./testenv.h"
13  
14  using namespace Dynarmic;
15  
16  TEST_CASE("Unicorn: Sanity test", "[a64]") {
17      A64TestEnv env;
18  
19      env.code_mem.emplace_back(0x8b020020);  // ADD X0, X1, X2
20      env.code_mem.emplace_back(0x14000000);  // B .
21  
22      constexpr A64Unicorn::RegisterArray regs{
23          0, 1, 2, 0, 0, 0, 0, 0,
24          0, 0, 0, 0, 0, 0, 0, 0,
25          0, 0, 0, 0, 0, 0, 0, 0,
26          0, 0, 0, 0, 0, 0, 0};
27  
28      A64Unicorn unicorn{env};
29  
30      unicorn.SetRegisters(regs);
31      unicorn.SetPC(0);
32  
33      env.ticks_left = 2;
34      unicorn.Run();
35  
36      REQUIRE(unicorn.GetRegisters()[0] == 3);
37      REQUIRE(unicorn.GetRegisters()[1] == 1);
38      REQUIRE(unicorn.GetRegisters()[2] == 2);
39      REQUIRE(unicorn.GetPC() == 4);
40  }
41  
42  TEST_CASE("Unicorn: Ensure 0xFFFF'FFFF'FFFF'FFFF is readable", "[a64]") {
43      A64TestEnv env;
44  
45      env.code_mem.emplace_back(0x385fed99);  // LDRB W25, [X12, #0xfffffffffffffffe]!
46      env.code_mem.emplace_back(0x14000000);  // B .
47  
48      A64Unicorn::RegisterArray regs{};
49      regs[12] = 1;
50  
51      A64Unicorn unicorn{env};
52  
53      unicorn.SetRegisters(regs);
54      unicorn.SetPC(0);
55  
56      env.ticks_left = 2;
57      unicorn.Run();
58  
59      REQUIRE(unicorn.GetPC() == 4);
60  }
61  
62  TEST_CASE("Unicorn: Ensure is able to read across page boundaries", "[a64]") {
63      A64TestEnv env;
64  
65      env.code_mem.emplace_back(0xb85f93d9);  // LDUR W25, [X30, #0xfffffffffffffff9]
66      env.code_mem.emplace_back(0x14000000);  // B .
67  
68      A64Unicorn::RegisterArray regs{};
69      regs[30] = 4;
70  
71      A64Unicorn unicorn{env};
72  
73      unicorn.SetRegisters(regs);
74      unicorn.SetPC(0);
75  
76      env.ticks_left = 2;
77      unicorn.Run();
78  
79      REQUIRE(unicorn.GetPC() == 4);
80  }