Skip to content

Commit

Permalink
Also test against QEMU.
Browse files Browse the repository at this point in the history
  • Loading branch information
rmacnak committed Nov 10, 2024
1 parent 8a9ff14 commit 9c1d3a8
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 61 deletions.
22 changes: 20 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,23 @@ jobs:
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- name: Build
run: make -j
- name: Install Dependencies
run: sudo apt install g++ g++-riscv64-linux-gnu qemu-user
- name: Build Host 32
run: |
rm -rf out
make -j out/rv32/test
- name: Test Host 32
run: out/rv32/test
- name: Build Host 64
run: |
rm -rf out
make -j out/rv64/test
- name: Test Host 64
run: out/rv64/test
- name: Build Cross 64
run: |
rm -rf out
CXX=riscv64-linux-gnu-g++ make -j out/rv64/test
- name: Test Cross 64
run: qemu-riscv64 -L /usr/riscv64-linux-gnu/ out/rv64/test
80 changes: 40 additions & 40 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,59 +1,59 @@
run_test: out out/test_rv64 out/test_rv32
./out/test_rv64
./out/test_rv32
run_test: out/rv64 out/rv64/test out/rv32/test
./out/rv64/test
./out/rv32/test

out:
mkdir -p out
CXXFLAGS += -O2 -g -std=c++17 -Werror -Wall -Wextra -Wnon-virtual-dtor -Wvla -Wno-unused-parameter -DDEBUG -fno-rtti -fno-exceptions -I.

CFLAGS64 = -O2 -g -std=c++17 -Werror -Wall -Wextra -Wnon-virtual-dtor -Wvla -Wno-unused-parameter -DDEBUG -DXLEN=64 -fno-rtti -fno-exceptions -I.
out/rv64:
mkdir -p out/rv64

out/test_rv64: out/simulator64.o out/disassembler64.o out/assembler64.o out/test64.o out/assert64.o out/os_macos64.o out/os_linux64.o
$(CXX) $(CFLAGS64) -lm -o out/test_rv64 out/simulator64.o out/disassembler64.o out/assembler64.o out/test64.o out/assert64.o out/os_macos64.o out/os_linux64.o
out/rv64/assembler.o: vm/assembler_riscv.cc vm/*.h Makefile out/rv64
$(CXX) $(CXXFLAGS) -DXLEN=64 -c -o out/rv64/assembler.o vm/assembler_riscv.cc

out/assembler64.o: vm/assembler_riscv.cc vm/*.h Makefile
$(CXX) $(CFLAGS64) -c -o out/assembler64.o vm/assembler_riscv.cc
out/rv64/assert.o: vm/assert.cc vm/*.h Makefile out/rv64
$(CXX) $(CXXFLAGS) -DXLEN=64 -c -o out/rv64/assert.o vm/assert.cc

out/assert64.o: vm/assert.cc vm/*.h Makefile
$(CXX) $(CFLAGS64) -c -o out/assert64.o vm/assert.cc
out/rv64/disassembler.o: vm/disassembler_riscv.cc vm/*.h Makefile out/rv64
$(CXX) $(CXXFLAGS) -DXLEN=64 -c -o out/rv64/disassembler.o vm/disassembler_riscv.cc

out/disassembler64.o: vm/disassembler_riscv.cc vm/*.h Makefile
$(CXX) $(CFLAGS64) -c -o out/disassembler64.o vm/disassembler_riscv.cc
out/rv64/simulator.o: vm/simulator_riscv.cc vm/*.h Makefile out/rv64
$(CXX) $(CXXFLAGS) -DXLEN=64 -c -o out/rv64/simulator.o vm/simulator_riscv.cc

out/simulator64.o: vm/simulator_riscv.cc vm/*.h Makefile
$(CXX) $(CFLAGS64) -c -o out/simulator64.o vm/simulator_riscv.cc
out/rv64/os_macos.o: vm/os_macos.cc vm/*.h Makefile out/rv64
$(CXX) $(CXXFLAGS) -DXLEN=64 -c -o out/rv64/os_macos.o vm/os_macos.cc

out/os_macos64.o: vm/os_macos.cc vm/*.h Makefile
$(CXX) $(CFLAGS64) -c -o out/os_macos64.o vm/os_macos.cc
out/rv64/os_linux.o: vm/os_linux.cc vm/*.h Makefile out/rv64
$(CXX) $(CXXFLAGS) -DXLEN=64 -c -o out/rv64/os_linux.o vm/os_linux.cc

out/os_linux64.o: vm/os_linux.cc vm/*.h Makefile
$(CXX) $(CFLAGS64) -c -o out/os_linux64.o vm/os_linux.cc
out/rv64/test.o: vm/test.cc vm/*.h Makefile out/rv64
$(CXX) $(CXXFLAGS) -DXLEN=64 -c -o out/rv64/test.o vm/test.cc

out/test64.o: vm/test.cc vm/*.h Makefile
$(CXX) $(CFLAGS64) -c -o out/test64.o vm/test.cc
out/rv64/test: out/rv64/simulator.o out/rv64/disassembler.o out/rv64/assembler.o out/rv64/test.o out/rv64/assert.o out/rv64/os_macos.o out/rv64/os_linux.o
$(CXX) $(CXXFLAGS) -lm -o out/rv64/test out/rv64/simulator.o out/rv64/disassembler.o out/rv64/assembler.o out/rv64/test.o out/rv64/assert.o out/rv64/os_macos.o out/rv64/os_linux.o

CFLAGSc64 = -O2 -g -std=c++17 -Werror -Wall -Wextra -Wnon-virtual-dtor -Wvla -Wno-unused-parameter -DDEBUG -DXLEN=32 -fno-rtti -fno-exceptions -I.
out/rv32:
mkdir -p out/rv32

out/test_rv32: out/simulatorc64.o out/disassemblerc64.o out/assemblerc64.o out/testc64.o out/assertc64.o out/os_macosc64.o out/os_linuxc64.o
$(CXX) $(CFLAGSc64) -lm -o out/test_rv32 out/simulatorc64.o out/disassemblerc64.o out/assemblerc64.o out/testc64.o out/assertc64.o out/os_macosc64.o out/os_linuxc64.o
out/rv32/assembler.o: vm/assembler_riscv.cc vm/*.h Makefile out/rv32
$(CXX) $(CXXFLAGS) -DXLEN=32 -c -o out/rv32/assembler.o vm/assembler_riscv.cc

out/assemblerc64.o: vm/assembler_riscv.cc vm/*.h Makefile
$(CXX) $(CFLAGSc64) -c -o out/assemblerc64.o vm/assembler_riscv.cc
out/rv32/assert.o: vm/assert.cc vm/*.h Makefile out/rv32
$(CXX) $(CXXFLAGS) -DXLEN=32 -c -o out/rv32/assert.o vm/assert.cc

out/assertc64.o: vm/assert.cc vm/*.h Makefile
$(CXX) $(CFLAGSc64) -c -o out/assertc64.o vm/assert.cc
out/rv32/disassembler.o: vm/disassembler_riscv.cc vm/*.h Makefile out/rv32
$(CXX) $(CXXFLAGS) -DXLEN=32 -c -o out/rv32/disassembler.o vm/disassembler_riscv.cc

out/disassemblerc64.o: vm/disassembler_riscv.cc vm/*.h Makefile
$(CXX) $(CFLAGSc64) -c -o out/disassemblerc64.o vm/disassembler_riscv.cc
out/rv32/simulator.o: vm/simulator_riscv.cc vm/*.h Makefile out/rv32
$(CXX) $(CXXFLAGS) -DXLEN=32 -c -o out/rv32/simulator.o vm/simulator_riscv.cc

out/simulatorc64.o: vm/simulator_riscv.cc vm/*.h Makefile
$(CXX) $(CFLAGSc64) -c -o out/simulatorc64.o vm/simulator_riscv.cc
out/rv32/os_macos.o: vm/os_macos.cc vm/*.h Makefile out/rv32
$(CXX) $(CXXFLAGS) -DXLEN=32 -c -o out/rv32/os_macos.o vm/os_macos.cc

out/os_macosc64.o: vm/os_macos.cc vm/*.h Makefile
$(CXX) $(CFLAGSc64) -c -o out/os_macosc64.o vm/os_macos.cc
out/rv32/os_linux.o: vm/os_linux.cc vm/*.h Makefile out/rv32
$(CXX) $(CXXFLAGS) -DXLEN=32 -c -o out/rv32/os_linux.o vm/os_linux.cc

out/os_linuxc64.o: vm/os_linux.cc vm/*.h Makefile
$(CXX) $(CFLAGSc64) -c -o out/os_linuxc64.o vm/os_linux.cc

out/testc64.o: vm/test.cc vm/*.h Makefile
$(CXX) $(CFLAGSc64) -c -o out/testc64.o vm/test.cc
out/rv32/test.o: vm/test.cc vm/*.h Makefile out/rv32
$(CXX) $(CXXFLAGS) -DXLEN=32 -c -o out/rv32/test.o vm/test.cc

out/rv32/test: out/rv32/simulator.o out/rv32/disassembler.o out/rv32/assembler.o out/rv32/test.o out/rv32/assert.o out/rv32/os_macos.o out/rv32/os_linux.o
$(CXX) $(CXXFLAGS) -lm -o out/rv32/test out/rv32/simulator.o out/rv32/disassembler.o out/rv32/assembler.o out/rv32/test.o out/rv32/assert.o out/rv32/os_macos.o out/rv32/os_linux.o
21 changes: 5 additions & 16 deletions vm/simulator_riscv.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,53 +15,42 @@

namespace psoup {

#if XLEN != HOST_XLEN
uintptr_t Memory::guest_base_ = 0;
uintptr_t Memory::guest_size_ = 0;
uintptr_t Memory::top_ = 0;
#endif

void Memory::Startup(size_t size) {
#if XLEN != HOST_XLEN
void* result =
mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
int prot = PROT_READ | PROT_WRITE;
#if defined(__riscv)
prot = prot | PROT_EXEC;
#endif
void* result = mmap(0, size, prot, MAP_ANON | MAP_PRIVATE, -1, 0);
if (result == MAP_FAILED) {
perror("mmap");
abort();
}

guest_base_ = top_ = reinterpret_cast<uintptr_t>(result);
guest_size_ = size;
#endif
}

void Memory::Shutdown() {
#if XLEN != HOST_XLEN
int result = munmap(reinterpret_cast<void*>(guest_base_), guest_size_);
if (result != 0) {
perror("munmap");
abort();
}
#endif
}

void* Memory::Allocate(size_t size) {
#if XLEN == HOST_XLEN
return malloc(size);
#else
uintptr_t result = top_;
top_ += size;
top_ = (top_ + 7) & ~7;
return reinterpret_cast<void*>(result);
#endif
}

void Memory::Free(void* ptr) {
#if XLEN == HOST_XLEN
free(ptr);
#else
// UNIMPLEMENTED: Leaking...
#endif
}

#if defined(USING_SIMULATOR)
Expand Down
2 changes: 0 additions & 2 deletions vm/simulator_riscv.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,9 @@ class Memory {
}

private:
#if XLEN != HOST_XLEN
static uintptr_t guest_base_;
static uintptr_t guest_size_;
static uintptr_t top_;
#endif
};

// Allows callouts from the simulation to the host.
Expand Down
12 changes: 11 additions & 1 deletion vm/test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,19 @@ class UnitTest {
static const UnitTest kRegister##name(#name, UnitTest_##name); \
void UnitTest_##name()

bool CanRun(ExtensionSet extensions) {
#if defined(USING_SIMULATOR)
return true;
#else
// Extensions not yet available in QEMU.
return !extensions.Includes(RV_Zalasr) && !extensions.Includes(RV_Zabha);
#endif
}

#define ASM_TEST(name, extensions) \
void AsmTest_##name(Assembler& assembler, Simulator& simulator); \
UNIT_TEST(name) { \
if (!CanRun(extensions)) return; \
Assembler assembler(extensions); \
Simulator simulator; \
AsmTest_##name(assembler, simulator); \
Expand Down Expand Up @@ -7846,7 +7856,7 @@ TEST_ENCODING(intptr_t, CShamt)
} // namespace psoup

int main(int argc, char** argv) {
psoup::Memory::Startup(64 * MB);
psoup::Memory::Startup(128 * MB);
for (psoup::UnitTest* test = psoup::tests_; test != nullptr;
test = test->next()) {
test->Run();
Expand Down

0 comments on commit 9c1d3a8

Please sign in to comment.