summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt26
-rw-r--r--CONTRIBUTING.md21
-rw-r--r--externals/microprofile/microprofile.h8
-rw-r--r--externals/microprofile/microprofileui.h1
-rwxr-xr-xhooks/pre-commit6
-rw-r--r--src/citra/CMakeLists.txt2
-rw-r--r--src/citra_qt/CMakeLists.txt2
-rw-r--r--src/common/file_util.cpp25
-rw-r--r--src/common/swap.h7
-rw-r--r--src/common/thread.cpp12
-rw-r--r--src/common/x64/cpu_detect.cpp8
-rw-r--r--src/core/hle/service/nwm_uds.cpp11
-rw-r--r--src/core/hle/service/soc_u.cpp8
13 files changed, 87 insertions, 50 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c7a24f04f..26dec8f86 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -105,6 +105,15 @@ else()
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE)
endif()
+# Set file offset size to 64 bits.
+#
+# On modern Unixes, this is typically already the case. The lone exception is
+# glibc, which may default to 32 bits. glibc allows this to be configured
+# by setting _FILE_OFFSET_BITS.
+if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ add_definitions(-D_FILE_OFFSET_BITS=64)
+endif()
+
add_definitions(-DSINGLETHREADED)
# CMake seems to only define _DEBUG on Windows
set_property(DIRECTORY APPEND PROPERTY
@@ -160,23 +169,30 @@ endif()
IF (APPLE)
FIND_LIBRARY(COCOA_LIBRARY Cocoa) # Umbrella framework for everything GUI-related
- set(PLATFORM_LIBRARIES iconv ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY})
+ set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++")
ELSEIF(MINGW)
- # GCC does not support codecvt, so use iconv instead
# PSAPI is the Process Status API
- set(PLATFORM_LIBRARIES winmm ws2_32 psapi iconv)
+ set(PLATFORM_LIBRARIES winmm ws2_32 psapi)
# WSAPoll functionality doesn't exist before WinNT 6.x (Vista and up)
add_definitions(-D_WIN32_WINNT=0x0600)
ELSEIF(WIN32)
set(PLATFORM_LIBRARIES winmm ws2_32)
-ELSE()
+ELSEIF(CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU|SunOS)$")
set(PLATFORM_LIBRARIES rt)
ENDIF (APPLE)
+# MINGW: GCC does not support codecvt, so use iconv instead
+if (UNIX OR MINGW)
+ find_library(ICONV_LIBRARY NAMES iconv)
+ if (ICONV_LIBRARY)
+ list(APPEND PLATFORM_LIBRARIES ${ICONV_LIBRARY})
+ endif()
+endif()
+
if (ENABLE_QT)
if (CITRA_USE_BUNDLED_QT)
if (MSVC14 AND ARCHITECTURE_x86_64)
@@ -253,7 +269,7 @@ add_subdirectory(src)
# http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html
# http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
# http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html
-if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD|NetBSD")
+if(ENABLE_QT AND UNIX AND NOT APPLE)
install(FILES "${CMAKE_SOURCE_DIR}/dist/citra.desktop"
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/applications")
install(FILES "${CMAKE_SOURCE_DIR}/dist/citra.svg"
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index c2735f564..3d6a87651 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,21 +1,19 @@
# Reporting Issues
-**The issue tracker is not a support forum.** Unless you can provide precise *technical information* regarding an issue, you *should not post in it*. If you need support, first read the [FAQ](https://github.com/citra-emu/citra/wiki/FAQ) and then either visit our IRC channel or ask in a general emulation forum such as [/r/emulation](https://www.reddit.com/r/emulation/). If you post support questions, generic messages to the developers or vague reports without technical details, they will be closed and locked.
+**The issue tracker is not a support forum.** Unless you can provide precise *technical information* regarding an issue, you *should not post in it*. If you need support, first read the [FAQ](https://github.com/citra-emu/citra/wiki/FAQ) and then either visit our IRC channel, [our forum](https://discuss.citra-emu.org/) or ask in a general emulation forum such as [/r/emulation](https://www.reddit.com/r/emulation/). If you post support questions, generic messages to the developers or vague reports without technical details, they will be closed and locked.
If you believe you have a valid issue report, please post text or a screenshot from the log (the console window that opens alongside Citra) and build version (hex string visible in the titlebar and zip filename), as well as your hardware and software information if applicable.
-While issues about specific games not booting are valid bugs, we are currently not interested in them unless you have several games which fail with the same or similar messages. (In which case please file only a single issue about it.) There are too many non-working games right now to file individual issues for every one of them.
-
# Contributing
-Citra is a brand new project, so we have a great opportunity to keep things clean and well organized early on. As such, coding style is very important when making commits. They aren't very strict rules since we want to be flexible and we understand that under certain circumstances some of them can be counterproductive. Just try to follow as many of them as possible:
+Citra is a brand new project, so we have a great opportunity to keep things clean and well organized early on. As such, coding style is very important when making commits. We run clang-format on our CI to check the code. Please use it to format your code when contributing. However, it doesn't cover all the rules below. Some of them aren't very strict rules since we want to be flexible and we understand that under certain circumstances some of them can be counterproductive. Just try to follow as many of them as possible:
### General Rules
* A lot of code was taken from other projects (e.g. Dolphin, PPSSPP, Gekko, SkyEye). In general, when editing other people's code, follow the style of the module you're in (or better yet, fix the style if it drastically differs from our guide).
-* Line width is typically 100 characters, but this isn't strictly enforced. Please do not use 80-characters.
+* Line width is typically 100 characters. Please do not use 80-characters.
* Don't ever introduce new external dependencies into Core
* Don't use any platform specific code in Core
* Use namespaces often
-* Avoid the use of C-style casts and instead prefer C++-style `static_cast` and `reinterpret_cast`. Never use `const_cast` or `dynamic_cast` (we build with RTTI disabled). The only exception to this rule is for casting between two numeric types, where C-style casts are encouraged for brevity and readability.
+* Avoid the use of C-style casts and instead prefer C++-style `static_cast` and `reinterpret_cast`. Try to avoid using `dynamic_cast`. Never use `const_cast`. The only exception to this rule is for casting between two numeric types, where C-style casts are encouraged for brevity and readability.
### Naming Rules
* Functions: `PascalCase`
@@ -59,9 +57,9 @@ char* g_some_pointer; // Pointer * and reference & stick to the type name
/// A colorful enum.
enum SomeEnum {
- COLOR_RED, ///< The color of fire.
- COLOR_GREEN, ///< The color of grass.
- COLOR_BLUE, ///< Not actually the color of water.
+ ColorRed, ///< The color of fire.
+ ColorGreen, ///< The color of grass.
+ ColorBlue, ///< Not actually the color of water.
};
/**
@@ -79,7 +77,7 @@ void FooBar() {
5,
25,
7,
- 42
+ 42,
};
if (note == the_space_after_the_if) {
@@ -88,9 +86,6 @@ void FooBar() {
// Use a space after the // when commenting
}
- // Comment directly above code when possible
- if (some_condition) single_statement();
-
// Place a single space after the for loop semicolons, prefer pre-increment
for (int i = 0; i != 25; ++i) {
// This is how we write loops
diff --git a/externals/microprofile/microprofile.h b/externals/microprofile/microprofile.h
index d1ae0c1c2..30613b3b0 100644
--- a/externals/microprofile/microprofile.h
+++ b/externals/microprofile/microprofile.h
@@ -206,7 +206,7 @@ int64_t MicroProfileGetTick();
#define MP_GETCURRENTTHREADID() GetCurrentThreadId()
typedef uint32_t ThreadIdType;
-#elif defined(__linux__)
+#elif !defined(_WIN32)
#include <unistd.h>
#include <time.h>
inline int64_t MicroProfileTicksPerSecondCpu()
@@ -510,7 +510,7 @@ typedef int MpSocket;
#endif
-#if defined(__APPLE__) || defined(__linux__)
+#ifndef _WIN32
typedef pthread_t MicroProfileThread;
#elif defined(_WIN32)
typedef HANDLE MicroProfileThread;
@@ -907,7 +907,7 @@ int64_t MicroProfileGetTick()
typedef void* (*MicroProfileThreadFunc)(void*);
-#if defined(__APPLE__) || defined(__linux__)
+#ifndef _WIN32
typedef pthread_t MicroProfileThread;
void MicroProfileThreadStart(MicroProfileThread* pThread, MicroProfileThreadFunc Func)
{
@@ -959,7 +959,7 @@ inline void MicroProfileThreadJoin(MicroProfileThread* pThread)
#define MP_INVALID_SOCKET(f) (f == INVALID_SOCKET)
#endif
-#if defined(__APPLE__)
+#ifndef _WIN32
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
diff --git a/externals/microprofile/microprofileui.h b/externals/microprofile/microprofileui.h
index 45bec8af6..66a73abc5 100644
--- a/externals/microprofile/microprofileui.h
+++ b/externals/microprofile/microprofileui.h
@@ -172,6 +172,7 @@ MICROPROFILEUI_API void MicroProfileCustomGroupAddTimer(const char* pCustomName,
#ifdef _WIN32
#define snprintf _snprintf
#endif
+#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <math.h>
diff --git a/hooks/pre-commit b/hooks/pre-commit
index ec2b5b77e..04fdaf8ec 100755
--- a/hooks/pre-commit
+++ b/hooks/pre-commit
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
# Enforce citra's whitespace policy
git config --local core.whitespace tab-in-indent,trailing-space
@@ -32,7 +32,7 @@ for f in $(git diff --name-only --diff-filter=ACMRTUXB --cached); do
if ! echo "$f" | egrep -q "^src/"; then
continue
fi
- d=$(diff -u "$f" <(clang-format "$f"))
+ d=$(clang-format "$f" | diff -u "$f" -)
if ! [ -z "$d" ]; then
echo "!!! $f not compliant to coding style, here is the fix:"
echo "$d"
@@ -40,4 +40,4 @@ for f in $(git diff --name-only --diff-filter=ACMRTUXB --cached); do
fi
done
-exit "$fail"
+exit "${fail-0}"
diff --git a/src/citra/CMakeLists.txt b/src/citra/CMakeLists.txt
index 43fa06b4e..f9c488a1a 100644
--- a/src/citra/CMakeLists.txt
+++ b/src/citra/CMakeLists.txt
@@ -23,7 +23,7 @@ if (MSVC)
endif()
target_link_libraries(citra ${PLATFORM_LIBRARIES} Threads::Threads)
-if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD|NetBSD")
+if(UNIX AND NOT APPLE)
install(TARGETS citra RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")
endif()
diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt
index b3c01ddd8..384875450 100644
--- a/src/citra_qt/CMakeLists.txt
+++ b/src/citra_qt/CMakeLists.txt
@@ -104,7 +104,7 @@ target_link_libraries(citra-qt core video_core audio_core common qhexedit)
target_link_libraries(citra-qt ${OPENGL_gl_LIBRARY} ${CITRA_QT_LIBS})
target_link_libraries(citra-qt ${PLATFORM_LIBRARIES} Threads::Threads)
-if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD|NetBSD")
+if(UNIX AND NOT APPLE)
install(TARGETS citra-qt RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")
endif()
diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp
index 14cbcac6b..407ed047a 100644
--- a/src/common/file_util.cpp
+++ b/src/common/file_util.cpp
@@ -23,8 +23,8 @@
#define fseeko _fseeki64
#define ftello _ftelli64
#define atoll _atoi64
-#define stat64 _stat64
-#define fstat64 _fstat64
+#define stat _stat64
+#define fstat _fstat64
#define fileno _fileno
#else
#ifdef __APPLE__
@@ -52,11 +52,6 @@
#define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR)
#endif
-#ifdef BSD4_4
-#define stat64 stat
-#define fstat64 fstat
-#endif
-
// This namespace has various generic functions related to files and paths.
// The code still needs a ton of cleanup.
// REMEMBER: strdup considered harmful!
@@ -76,7 +71,7 @@ static void StripTailDirSlashes(std::string& fname) {
// Returns true if file filename exists
bool Exists(const std::string& filename) {
- struct stat64 file_info;
+ struct stat file_info;
std::string copy(filename);
StripTailDirSlashes(copy);
@@ -88,7 +83,7 @@ bool Exists(const std::string& filename) {
int result = _wstat64(Common::UTF8ToUTF16W(copy).c_str(), &file_info);
#else
- int result = stat64(copy.c_str(), &file_info);
+ int result = stat(copy.c_str(), &file_info);
#endif
return (result == 0);
@@ -96,7 +91,7 @@ bool Exists(const std::string& filename) {
// Returns true if filename is a directory
bool IsDirectory(const std::string& filename) {
- struct stat64 file_info;
+ struct stat file_info;
std::string copy(filename);
StripTailDirSlashes(copy);
@@ -108,7 +103,7 @@ bool IsDirectory(const std::string& filename) {
int result = _wstat64(Common::UTF8ToUTF16W(copy).c_str(), &file_info);
#else
- int result = stat64(copy.c_str(), &file_info);
+ int result = stat(copy.c_str(), &file_info);
#endif
if (result < 0) {
@@ -339,11 +334,11 @@ u64 GetSize(const std::string& filename) {
return 0;
}
- struct stat64 buf;
+ struct stat buf;
#ifdef _WIN32
if (_wstat64(Common::UTF8ToUTF16W(filename).c_str(), &buf) == 0)
#else
- if (stat64(filename.c_str(), &buf) == 0)
+ if (stat(filename.c_str(), &buf) == 0)
#endif
{
LOG_TRACE(Common_Filesystem, "%s: %lld", filename.c_str(), (long long)buf.st_size);
@@ -356,8 +351,8 @@ u64 GetSize(const std::string& filename) {
// Overloaded GetSize, accepts file descriptor
u64 GetSize(const int fd) {
- struct stat64 buf;
- if (fstat64(fd, &buf) != 0) {
+ struct stat buf;
+ if (fstat(fd, &buf) != 0) {
LOG_ERROR(Common_Filesystem, "GetSize: stat failed %i: %s", fd, GetLastErrorMsg());
return 0;
}
diff --git a/src/common/swap.h b/src/common/swap.h
index e241c9f73..d94cbe6b2 100644
--- a/src/common/swap.h
+++ b/src/common/swap.h
@@ -21,7 +21,8 @@
#include <cstdlib>
#elif defined(__linux__)
#include <byteswap.h>
-#elif defined(__FreeBSD__)
+#elif defined(__Bitrig__) || defined(__DragonFly__) || defined(__FreeBSD__) || \
+ defined(__NetBSD__) || defined(__OpenBSD__)
#include <sys/endian.h>
#endif
#include <cstring>
@@ -101,7 +102,9 @@ inline __attribute__((always_inline)) u32 swap32(u32 _data) {
inline __attribute__((always_inline)) u64 swap64(u64 _data) {
return __builtin_bswap64(_data);
}
-#elif __FreeBSD__
+#elif defined(__Bitrig__) || defined(__OpenBSD__)
+// swap16, swap32, swap64 are left as is
+#elif defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__)
inline u16 swap16(u16 _data) {
return bswap16(_data);
}
diff --git a/src/common/thread.cpp b/src/common/thread.cpp
index 6e7b39b9a..9bb2f4e1d 100644
--- a/src/common/thread.cpp
+++ b/src/common/thread.cpp
@@ -8,7 +8,7 @@
#elif defined(_WIN32)
#include <Windows.h>
#else
-#if defined(BSD4_4) || defined(__OpenBSD__)
+#if defined(__Bitrig__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__)
#include <pthread_np.h>
#else
#include <pthread.h>
@@ -19,6 +19,10 @@
#include <unistd.h>
#endif
+#ifdef __FreeBSD__
+#define cpu_set_t cpuset_t
+#endif
+
namespace Common {
int CurrentThreadId() {
@@ -86,7 +90,7 @@ void SetCurrentThreadName(const char* szThreadName) {
void SetThreadAffinity(std::thread::native_handle_type thread, u32 mask) {
#ifdef __APPLE__
thread_policy_set(pthread_mach_thread_np(thread), THREAD_AFFINITY_POLICY, (integer_t*)&mask, 1);
-#elif (defined __linux__ || defined BSD4_4) && !(defined ANDROID)
+#elif (defined __linux__ || defined __FreeBSD__) && !(defined ANDROID)
cpu_set_t cpu_set;
CPU_ZERO(&cpu_set);
@@ -117,8 +121,10 @@ void SwitchCurrentThread() {
void SetCurrentThreadName(const char* szThreadName) {
#ifdef __APPLE__
pthread_setname_np(szThreadName);
-#elif defined(__OpenBSD__)
+#elif defined(__Bitrig__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__)
pthread_set_name_np(pthread_self(), szThreadName);
+#elif defined(__NetBSD__)
+ pthread_setname_np(pthread_self(), "%s", (void*)szThreadName);
#else
pthread_setname_np(pthread_self(), szThreadName);
#endif
diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp
index 6ddf9b70c..370ae2c80 100644
--- a/src/common/x64/cpu_detect.cpp
+++ b/src/common/x64/cpu_detect.cpp
@@ -12,13 +12,15 @@ namespace Common {
#ifndef _MSC_VER
-#ifdef __FreeBSD__
-#include <machine/cpufunc.h>
+#if defined(__DragonFly__) || defined(__FreeBSD__)
+// clang-format off
#include <sys/types.h>
+#include <machine/cpufunc.h>
+// clang-format on
#endif
static inline void __cpuidex(int info[4], int function_id, int subfunction_id) {
-#ifdef __FreeBSD__
+#if defined(__DragonFly__) || defined(__FreeBSD__)
// Despite the name, this is just do_cpuid() with ECX as second input.
cpuid_count((u_int)function_id, (u_int)subfunction_id, (u_int*)info);
#else
diff --git a/src/core/hle/service/nwm_uds.cpp b/src/core/hle/service/nwm_uds.cpp
index 27e829209..80081aae2 100644
--- a/src/core/hle/service/nwm_uds.cpp
+++ b/src/core/hle/service/nwm_uds.cpp
@@ -97,10 +97,21 @@ static void Initialize(Service::Interface* self) {
u32 value = cmd_buff[13];
u32 handle = cmd_buff[14];
+ // Because NWM service is not implemented at all, we stub the Initialize function with an error
+ // code instead of success to prevent games from using the service and from causing more issues.
+ // The error code is from a real 3DS with wifi off, thus believed to be "network disabled".
+ /*
cmd_buff[1] = RESULT_SUCCESS.raw;
cmd_buff[2] = 0;
cmd_buff[3] = Kernel::g_handle_table.Create(handle_event)
.MoveFrom(); // TODO(purpasmart): Verify if this is a event handle
+ */
+ cmd_buff[0] = IPC::MakeHeader(0x1B, 1, 2);
+ cmd_buff[1] = ResultCode(static_cast<ErrorDescription>(2), ErrorModule::UDS,
+ ErrorSummary::StatusChanged, ErrorLevel::Status)
+ .raw;
+ cmd_buff[2] = 0;
+ cmd_buff[3] = 0;
LOG_WARNING(Service_NWM, "(STUBBED) called unk1=0x%08X, unk2=0x%08X, value=%u, handle=0x%08X",
unk1, unk2, value, handle);
diff --git a/src/core/hle/service/soc_u.cpp b/src/core/hle/service/soc_u.cpp
index 4279b67fb..46b75db25 100644
--- a/src/core/hle/service/soc_u.cpp
+++ b/src/core/hle/service/soc_u.cpp
@@ -104,7 +104,9 @@ static const std::unordered_map<int, int> error_map = {{
{ERRNO(ENETUNREACH), 40},
{ENFILE, 41},
{ERRNO(ENOBUFS), 42},
+#ifdef ENODATA
{ENODATA, 43},
+#endif
{ENODEV, 44},
{ENOENT, 45},
{ENOEXEC, 46},
@@ -114,8 +116,12 @@ static const std::unordered_map<int, int> error_map = {{
{ENOMSG, 50},
{ERRNO(ENOPROTOOPT), 51},
{ENOSPC, 52},
+#ifdef ENOSR
{ENOSR, 53},
+#endif
+#ifdef ENOSTR
{ENOSTR, 54},
+#endif
{ENOSYS, 55},
{ERRNO(ENOTCONN), 56},
{ENOTDIR, 57},
@@ -136,7 +142,9 @@ static const std::unordered_map<int, int> error_map = {{
{ESPIPE, 72},
{ESRCH, 73},
{ERRNO(ESTALE), 74},
+#ifdef ETIME
{ETIME, 75},
+#endif
{ERRNO(ETIMEDOUT), 76},
}};