I'm working on RISCV64 support for a while and would like to know the chances of it being accepted. WOW64 with emulation dlls (Hangover style) is already working somewhat, not perfectly, but I'm not done yet. That's also the main goal, having RISCV64 Wine built as Unix to run new WOW64 on top of it with emulators. Cleanup/Fixing is still in progress, so this draft only contains early bits.
From: André Zwing nerv@dawncrow.de
--- configure.ac | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/configure.ac b/configure.ac index 9e550559589..70ddbe3bc21 100644 --- a/configure.ac +++ b/configure.ac @@ -184,8 +184,8 @@ esac
enable_win16=${enable_win16:-i386} enable_win64=${enable_win64:-no} -enable_wow64=${enable_wow64:-aarch64,x86_64} -enable_wow64win=${enable_wow64win:-aarch64,x86_64} +enable_wow64=${enable_wow64:-aarch64,x86_64,riscv64} +enable_wow64win=${enable_wow64win:-aarch64,x86_64,riscv64} enable_wow64cpu=${enable_wow64cpu:-x86_64} enable_vcruntime140_1=${enable_vcruntime140_1:-x86_64,arm64ec}
@@ -220,6 +220,7 @@ case "$host_cpu" in arm*) HOST_ARCH=arm ;; i[[3456789]]86*) HOST_ARCH=i386 ;; x86_64) HOST_ARCH=x86_64 ;; + riscv64) HOST_ARCH=riscv64 ;; esac m4_set_add_all([_AC_SUBST_VARS],[HOST_ARCH]m4_foreach([cpu],[aarch64,arm,arm64ec,i386,x86_64], [m4_foreach([var],[CC,CFLAGS,EXTRACFLAGS,LDFLAGS,DEBUG,TARGET,DELAYLOADFLAG,DISABLED_SUBDIRS],[,cpu[_]var])])) @@ -2037,11 +2038,13 @@ AC_SUBST(WINELOADER_PROGRAMS,"$wine_binary")
case $host_os in linux*) - if test $HOST_ARCH != unknown - then - test "$wine_binary" = wine || WINE_IGNORE_FILE(loader/wine-preloader) - WINELOADER_PROGRAMS="$WINELOADER_PROGRAMS $wine_binary-preloader" - fi + case $HOST_ARCH in + i386|x86_64|aarch64|arm) + test "$wine_binary" = wine || WINE_IGNORE_FILE(loader/wine-preloader) + WINELOADER_PROGRAMS="$WINELOADER_PROGRAMS $wine_binary-preloader" + ;; + *) ;; + esac ;; darwin*|macosx*) if test "$wine_can_build_preloader" = "yes" @@ -2371,6 +2374,7 @@ case $host_cpu in *powerpc*) WINE_CHECK_DEFINE([__powerpc__]) ;; *aarch64*) WINE_CHECK_DEFINE([__aarch64__]) ;; *arm*) WINE_CHECK_DEFINE([__arm__]) ;; + *riscv64*) WINE_CHECK_DEFINE([__riscv64__]) ;; esac
case $host_vendor in
From: André Hentschel nerv@dawncrow.de
--- include/basetsd.h | 2 +- include/msvcrt/corecrt.h | 2 +- include/windef.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/include/basetsd.h b/include/basetsd.h index c16d55422bb..53d1ec564f7 100644 --- a/include/basetsd.h +++ b/include/basetsd.h @@ -36,7 +36,7 @@ extern "C" { * 64-bit. */
-#if (defined(__x86_64__) || defined(__powerpc64__) || defined(__aarch64__)) && !defined(_WIN64) +#if (defined(__x86_64__) || defined(__powerpc64__) || defined(__aarch64__) || defined(__riscv64__)) && !defined(_WIN64) #define _WIN64 #endif
diff --git a/include/msvcrt/corecrt.h b/include/msvcrt/corecrt.h index 945d8ac4055..a744f6d5c26 100644 --- a/include/msvcrt/corecrt.h +++ b/include/msvcrt/corecrt.h @@ -41,7 +41,7 @@ # define WIN32 #endif
-#if (defined(__x86_64__) || defined(__powerpc64__) || defined(__aarch64__)) && !defined(_WIN64) +#if (defined(__x86_64__) || defined(__powerpc64__) || defined(__aarch64__) || defined(__riscv64__)) && !defined(_WIN64) #define _WIN64 #endif
diff --git a/include/windef.h b/include/windef.h index 79a96791151..69d62634337 100644 --- a/include/windef.h +++ b/include/windef.h @@ -41,7 +41,7 @@ extern "C" {
/* Calling conventions definitions */
-#if (defined(__x86_64__) || defined(__powerpc64__) || defined(__aarch64__)) && !defined(_WIN64) +#if (defined(__x86_64__) || defined(__powerpc64__) || defined(__aarch64__) || defined(__riscv64__)) && !defined(_WIN64) #define _WIN64 #endif
From: André Zwing nerv@dawncrow.de
--- loader/main.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/loader/main.c b/loader/main.c index c258e025183..ef93b3a6e7d 100644 --- a/loader/main.c +++ b/loader/main.c @@ -134,6 +134,8 @@ static void *load_ntdll( char *argv0 ) #define SO_DIR "arm-unix/" #elif defined(__aarch64__) #define SO_DIR "aarch64-unix/" +#elif defined(__riscv64__) +#define SO_DIR "riscv64-unix/" #else #define SO_DIR "" #endif
From: André Zwing nerv@dawncrow.de
--- programs/wineboot/wineboot.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c index c16446cf289..0db154aa6d2 100644 --- a/programs/wineboot/wineboot.c +++ b/programs/wineboot/wineboot.c @@ -796,6 +796,9 @@ static void create_hardware_registry_keys(void) swprintf( id, ARRAY_SIZE(id), L"ARM Family %u Model %u Revision %u", sci.ProcessorLevel, HIBYTE(sci.ProcessorRevision), LOBYTE(sci.ProcessorRevision) ); break; + case PROCESSOR_ARCHITECTURE_RISCV64: + swprintf( id, ARRAY_SIZE(id), L"RISC-V 64" ); + break;
case PROCESSOR_ARCHITECTURE_AMD64: get_identifier( id, ARRAY_SIZE(id), !wcscmp(vendorid, L"AuthenticAMD") ? L"AMD64" : L"Intel64" ); @@ -820,6 +823,9 @@ static void create_hardware_registry_keys(void) case PROCESSOR_ARCHITECTURE_ARM64: set_reg_value( system_key, L"Identifier", L"ARM processor family" ); break; + case PROCESSOR_ARCHITECTURE_RISCV64: + set_reg_value( system_key, L"Identifier", L"RISC-V 64 processor family" ); + break;
case PROCESSOR_ARCHITECTURE_INTEL: case PROCESSOR_ARCHITECTURE_AMD64: @@ -924,6 +930,9 @@ static void create_environment_registry_keys( void ) swprintf( buffer, ARRAY_SIZE(buffer), L"ARM Family %u Model %u Revision %u", sci.ProcessorLevel, HIBYTE(sci.ProcessorRevision), LOBYTE(sci.ProcessorRevision) ); break; + case PROCESSOR_ARCHITECTURE_RISCV64: + swprintf( buffer, ARRAY_SIZE(buffer), L"RISC-V 64 Family" ); + break;
case PROCESSOR_ARCHITECTURE_AMD64: case PROCESSOR_ARCHITECTURE_INTEL:
From: André Zwing nerv@dawncrow.de
--- tools/tools.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/tools/tools.h b/tools/tools.h index 5372b5bd303..38c6ac1a267 100644 --- a/tools/tools.h +++ b/tools/tools.h @@ -65,7 +65,7 @@ extern char **environ; # define O_BINARY 0 # endif # ifndef __int64 -# if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__) +# if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__) || defined(__riscv64__) # define __int64 long # else # define __int64 long long @@ -90,7 +90,7 @@ extern char **environ;
struct target { - enum { CPU_i386, CPU_x86_64, CPU_ARM, CPU_ARM64, CPU_ARM64EC } cpu; + enum { CPU_i386, CPU_x86_64, CPU_ARM, CPU_ARM64, CPU_ARM64EC, CPU_RISCV64 } cpu;
enum { @@ -447,6 +447,8 @@ static inline struct target get_default_target(void) target.cpu = CPU_ARM; #elif defined(__aarch64__) target.cpu = CPU_ARM64; +#elif defined(__riscv64__) + target.cpu = CPU_RISCV64; #else #error Unsupported CPU #endif @@ -482,6 +484,7 @@ static inline unsigned int get_target_ptr_size( struct target target ) [CPU_ARM] = 4, [CPU_ARM64] = 8, [CPU_ARM64EC] = 8, + [CPU_RISCV64] = 8, }; return sizes[target.cpu]; } @@ -504,6 +507,9 @@ static inline void set_target_ptr_size( struct target *target, unsigned int size case CPU_ARM64EC: if (size == 4) target->cpu = CPU_ARM; break; + case CPU_RISCV64: + /* not necessary */ + break; } }
@@ -527,6 +533,7 @@ static inline int get_cpu_from_name( const char *name ) { "arm64ec", CPU_ARM64EC }, { "arm64", CPU_ARM64 }, { "arm", CPU_ARM }, + { "riscv64", CPU_RISCV64 }, }; unsigned int i;
@@ -574,6 +581,7 @@ static inline const char *get_arch_dir( struct target target ) [CPU_ARM] = "arm", [CPU_ARM64] = "aarch64", [CPU_ARM64EC] = "arm64ec", + [CPU_RISCV64] = "riscv64", };
if (!cpu_names[target.cpu]) return "";
From: André Zwing nerv@dawncrow.de
--- tools/winegcc/winegcc.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c index 56fe179c92b..514e149ced0 100644 --- a/tools/winegcc/winegcc.c +++ b/tools/winegcc/winegcc.c @@ -507,6 +507,7 @@ static const char *get_multiarch_dir( struct target target ) case CPU_x86_64: return "/x86_64-linux-gnu"; case CPU_ARM: return "/arm-linux-gnueabi"; case CPU_ARM64: return "/aarch64-linux-gnu"; + case CPU_RISCV64: return "/riscv64-linux-gnu"; default: assert(0); } @@ -703,6 +704,11 @@ static void compile(struct options* opts, const char* lang) strarray_add(&comp_args, "-D__cdecl=__stdcall"); strarray_add(&comp_args, "-D__fastcall=__stdcall"); break; + case CPU_RISCV64: + strarray_add(&comp_args, "-D__stdcall="); + strarray_add(&comp_args, "-D__cdecl=__stdcall"); + strarray_add(&comp_args, "-D__fastcall=__stdcall"); + break; case CPU_ARM64EC: break; }
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=142202
Your paranoid android.
=== debian11 (build log) ===
../wine/programs/wineboot/wineboot.c:799:10: error: ���PROCESSOR_ARCHITECTURE_RISCV64��� undeclared (first use in this function); did you mean ���PROCESSOR_ARCHITECTURE_IA64���? ../wine/programs/wineboot/wineboot.c:933:10: error: ���PROCESSOR_ARCHITECTURE_RISCV64��� undeclared (first use in this function); did you mean ���PROCESSOR_ARCHITECTURE_IA64���? Task: The win32 Wine build failed
=== debian11b (build log) ===
../wine/programs/wineboot/wineboot.c:799:10: error: ���PROCESSOR_ARCHITECTURE_RISCV64��� undeclared (first use in this function); did you mean ���PROCESSOR_ARCHITECTURE_IA64���? ../wine/programs/wineboot/wineboot.c:933:10: error: ���PROCESSOR_ARCHITECTURE_RISCV64��� undeclared (first use in this function); did you mean ���PROCESSOR_ARCHITECTURE_IA64���? Task: The wow64 Wine build failed
This should stay in Hangover for now, I don't think we want to commit to supporting a new architecture at this point, particularly one that doesn't have a defined Windows ABI yet.
Thanks for the clarification. So same thing as with ppc64le, hopefully with a better ending :)
This merge request was closed by André Zwing.