From f36d8a3b236c2cbbbbd13df926bbe2a7e4eec88f Mon Sep 17 00:00:00 2001 From: Eric Long Date: Mon, 25 Sep 2023 20:15:25 +0800 Subject: [PATCH] RISC-V support With some addition to macros the project is able to build on riscv64 machine. plthook has added RISC-V support upstream [1]. However upstream has changed their code quite a bit, so I just modified the current vendored version. [1]: https://github.com/kubo/plthook/commit/a564738a4707fc5eb4d388b9e97eeab51b8c9d56 --- renderdoc/3rdparty/plthook/plthook_elf.c | 3 +++ renderdoc/common/globalconfig.h | 5 +++-- renderdoc/os/posix/linux/linux_process.cpp | 9 +++++++++ util/test/demos/vk/vk_ext_buffer_address.cpp | 5 +++-- util/test/demos/vk/vk_headers.h | 2 +- util/test/demos/vk/vk_khr_buffer_address.cpp | 5 +++-- util/test/demos/vk/vk_mem_bench.cpp | 5 +++-- 7 files changed, 25 insertions(+), 9 deletions(-) diff --git a/renderdoc/3rdparty/plthook/plthook_elf.c b/renderdoc/3rdparty/plthook/plthook_elf.c index 612f689d6..6fc2ac6e3 100644 --- a/renderdoc/3rdparty/plthook/plthook_elf.c +++ b/renderdoc/3rdparty/plthook/plthook_elf.c @@ -95,6 +95,9 @@ #elif defined __powerpc__ #define R_JUMP_SLOT R_PPC_JMP_SLOT #define Elf_Plt_Rel Elf_Rela +#elif defined __riscv +#define R_JUMP_SLOT R_RISCV_JUMP_SLOT +#define Elf_Plt_Rel Elf_Rela #elif 0 /* disabled because not tested */ && (defined __sparcv9 || defined __sparc_v9__) #define R_JUMP_SLOT R_SPARC_JMP_SLOT #define Elf_Plt_Rel Elf_Rela diff --git a/renderdoc/common/globalconfig.h b/renderdoc/common/globalconfig.h index d65d4e5e7..45f11458d 100644 --- a/renderdoc/common/globalconfig.h +++ b/renderdoc/common/globalconfig.h @@ -36,8 +36,9 @@ ///////////////////////////////////////////////// // Build/machine configuration -#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || \ - defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) +#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) || \ + (defined(__riscv64) && __riscv_xlen == 64) #define RDOC_X64 OPTION_ON #else #define RDOC_X64 OPTION_OFF diff --git a/renderdoc/os/posix/linux/linux_process.cpp b/renderdoc/os/posix/linux/linux_process.cpp index 488dfedb9..4130e9e8d 100644 --- a/renderdoc/os/posix/linux/linux_process.cpp +++ b/renderdoc/os/posix/linux/linux_process.cpp @@ -227,6 +227,15 @@ static uint64_t get_nanotime() // the instruction pointer at all. #define BREAK_INST_INST_PTR_ADJUST 0 +#elif defined(__riscv) + +#define INST_PTR_REG pc + +// ebreak +#define BREAK_INST 0x00100073ULL +#define BREAK_INST_BYTES_SIZE 4 +#define BREAK_INST_INST_PTR_ADJUST 4 + #else #define BREAK_INST 0xccULL diff --git a/util/test/demos/vk/vk_ext_buffer_address.cpp b/util/test/demos/vk/vk_ext_buffer_address.cpp index e2761f155..7dec4af4b 100644 --- a/util/test/demos/vk/vk_ext_buffer_address.cpp +++ b/util/test/demos/vk/vk_ext_buffer_address.cpp @@ -27,8 +27,9 @@ // only support on 64-bit, just because it's easier to share CPU & GPU structs if pointer size is // identical -#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || \ - defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) +#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) || \ + (defined(__riscv) && __riscv_xlen == 64) RD_TEST(VK_EXT_Buffer_Address, VulkanGraphicsTest) { diff --git a/util/test/demos/vk/vk_headers.h b/util/test/demos/vk/vk_headers.h index 9ef72621a..c755bbbd6 100644 --- a/util/test/demos/vk/vk_headers.h +++ b/util/test/demos/vk/vk_headers.h @@ -32,7 +32,7 @@ #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || \ defined(_M_X64) || defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || \ - defined(__powerpc64__) + defined(__powerpc64__) || (defined(__riscv) && __riscv_xlen == 64) #else diff --git a/util/test/demos/vk/vk_khr_buffer_address.cpp b/util/test/demos/vk/vk_khr_buffer_address.cpp index 6ebb35dab..ff02e9cd0 100644 --- a/util/test/demos/vk/vk_khr_buffer_address.cpp +++ b/util/test/demos/vk/vk_khr_buffer_address.cpp @@ -27,8 +27,9 @@ // only support on 64-bit, just because it's easier to share CPU & GPU structs if pointer size is // identical -#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || \ - defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) +#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) || \ + (defined(__riscv) && __riscv_xlen == 64) RD_TEST(VK_KHR_Buffer_Address, VulkanGraphicsTest) { diff --git a/util/test/demos/vk/vk_mem_bench.cpp b/util/test/demos/vk/vk_mem_bench.cpp index b688bfbc7..830f39f09 100644 --- a/util/test/demos/vk/vk_mem_bench.cpp +++ b/util/test/demos/vk/vk_mem_bench.cpp @@ -78,8 +78,9 @@ bool Vec16NotEqual(void *a, void *b) } return false; -#elif defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || \ - defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) +#elif defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) || \ + (defined(__riscv) && __riscv_xlen == 64) uint64_t *a64 = (uint64_t *)a; uint64_t *b64 = (uint64_t *)b;