-
Notifications
You must be signed in to change notification settings - Fork 53
/
basic32.cpp
75 lines (65 loc) · 1.79 KB
/
basic32.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <catch2/catch_test_macros.hpp>
#include <catch2/matchers/catch_matchers_string.hpp>
#include <libriscv/machine.hpp>
extern std::vector<uint8_t> build_and_load(const std::string& code,
const std::string& args = "-O2 -static", bool cpp = false);
static const uint64_t MAX_INSTRUCTIONS = 10'000'000ul;
using namespace riscv;
TEST_CASE("Instantiate 32-bit machine using 64-bit ELF", "[Instantiate]")
{
REQUIRE_THROWS([] {
const auto binary = build_and_load(R"M(
int main() {
return 666;
})M");
riscv::Machine<RISCV32> machine { binary };
}());
}
TEST_CASE("Validate custom 32-bit ELF", "[Instantiate]")
{
const auto binary = build_and_load(R"M(
__asm__(".global _start\n"
".section .text\n"
"_start:\n"
" li a0, 0xDEADBEEF\n"
" li a7, 1\n"
" ecall\n"
" nop\n"
" wfi\n");
)M", "-static -march=rv32g -mabi=ilp32d -nostdlib");
riscv::Machine<RISCV32> machine { binary };
machine.install_syscall_handler(1,
[] (auto& machine) { machine.stop(); });
machine.simulate(10);
REQUIRE(machine.return_value() == 0xDEADBEEF);
}
TEST_CASE("Validate 32-bit fib()", "[Compute]")
{
// 64-bit arguments require two registers
// and consumes 2 return registers (A0, A1).
const auto binary = build_and_load(R"M(
#define u64 long long
u64 fib(u64 n, u64 acc, u64 prev)
{
if (n < 1)
return acc;
else
return fib(n - 1, prev + acc, acc);
}
__asm__(".global _start\n"
".section .text\n"
"_start:\n"
" li a0, 50\n"
" li a2, 0\n"
" li a4, 1\n"
" call fib\n"
" li a7, 1\n"
" ecall\n"
" wfi\n");
)M", "-static -march=rv32g -mabi=ilp32d -nostdlib");
riscv::Machine<RISCV32> machine { binary };
machine.install_syscall_handler(1,
[] (auto& machine) { machine.stop(); });
machine.simulate(MAX_INSTRUCTIONS);
REQUIRE(machine.return_value<uint64_t>() == 12586269025L);
}