verify_unicorn.cpp 1.8 KB

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