early-access version 1775
This commit is contained in:
parent
b8dbfa096c
commit
b878f2517c
@ -1,7 +1,7 @@
|
|||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 1774.
|
This is the source code for early-access 1775.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
@ -1,17 +1,21 @@
|
|||||||
#ifdef __linux__
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
#include <iterator>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <boost/icl/separate_interval_set.hpp>
|
||||||
|
#include <windows.h>
|
||||||
|
#include "common/dynamic_library.h"
|
||||||
|
|
||||||
|
#elif defined(__linux__) // ^^^ Windows ^^^ vvv Linux vvv
|
||||||
|
|
||||||
#ifndef _GNU_SOURCE
|
#ifndef _GNU_SOURCE
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
#endif
|
#endif
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#elif defined(_WIN32) // ^^^ Linux ^^^ vvv Windows vvv
|
|
||||||
#include <iterator>
|
#endif // ^^^ Linux ^^^
|
||||||
#include <unordered_map>
|
|
||||||
#include <boost/icl/separate_interval_set.hpp>
|
|
||||||
#include <windows.h>
|
|
||||||
#include "common/dynamic_library.h"
|
|
||||||
#endif // ^^^ Windows ^^^
|
|
||||||
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
@ -19,6 +23,7 @@
|
|||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "common/host_memory.h"
|
#include "common/host_memory.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
|
#include "common/scope_exit.h"
|
||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
|
||||||
@ -34,6 +39,12 @@ constexpr size_t HugePageSize = 0x200000;
|
|||||||
#ifndef MEM_REPLACE_PLACEHOLDER
|
#ifndef MEM_REPLACE_PLACEHOLDER
|
||||||
#define MEM_REPLACE_PLACEHOLDER 0x00004000
|
#define MEM_REPLACE_PLACEHOLDER 0x00004000
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef MEM_COALESCE_PLACEHOLDERS
|
||||||
|
#define MEM_COALESCE_PLACEHOLDERS 0x00000001
|
||||||
|
#endif
|
||||||
|
#ifndef MEM_PRESERVE_PLACEHOLDER
|
||||||
|
#define MEM_PRESERVE_PLACEHOLDER 0x00000002
|
||||||
|
#endif
|
||||||
|
|
||||||
using PFN_CreateFileMapping2 = _Ret_maybenull_ HANDLE(WINAPI*)(
|
using PFN_CreateFileMapping2 = _Ret_maybenull_ HANDLE(WINAPI*)(
|
||||||
_In_ HANDLE File, _In_opt_ SECURITY_ATTRIBUTES* SecurityAttributes, _In_ ULONG DesiredAccess,
|
_In_ HANDLE File, _In_opt_ SECURITY_ATTRIBUTES* SecurityAttributes, _In_ ULONG DesiredAccess,
|
||||||
@ -333,18 +344,23 @@ private:
|
|||||||
std::unordered_map<size_t, size_t> placeholder_host_pointers; ///< Placeholder backing offset
|
std::unordered_map<size_t, size_t> placeholder_host_pointers; ///< Placeholder backing offset
|
||||||
};
|
};
|
||||||
|
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__) // ^^^ Windows ^^^ vvv Linux vvv
|
||||||
|
|
||||||
class HostMemory::Impl {
|
class HostMemory::Impl {
|
||||||
public:
|
public:
|
||||||
explicit Impl(size_t backing_size_, size_t virtual_size_)
|
explicit Impl(size_t backing_size_, size_t virtual_size_)
|
||||||
: backing_size{backing_size_}, virtual_size{virtual_size_} {
|
: backing_size{backing_size_}, virtual_size{virtual_size_} {
|
||||||
|
bool good = false;
|
||||||
|
SCOPE_EXIT({
|
||||||
|
if (!good) {
|
||||||
|
Release();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Backing memory initialization
|
// Backing memory initialization
|
||||||
fd = memfd_create("HostMemory", 0);
|
fd = memfd_create("HostMemory", 0);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
LOG_CRITICAL(HW_Memory, "memfd_create failed: {}", strerror(errno));
|
LOG_CRITICAL(HW_Memory, "memfd_create failed: {}", strerror(errno));
|
||||||
Release();
|
|
||||||
throw std::bad_alloc{};
|
throw std::bad_alloc{};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,7 +369,6 @@ public:
|
|||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
LOG_CRITICAL(HW_Memory, "ftruncate failed with {}, are you out-of-memory?",
|
LOG_CRITICAL(HW_Memory, "ftruncate failed with {}, are you out-of-memory?",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
Release();
|
|
||||||
throw std::bad_alloc{};
|
throw std::bad_alloc{};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -361,7 +376,6 @@ public:
|
|||||||
mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
|
mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
|
||||||
if (backing_base == MAP_FAILED) {
|
if (backing_base == MAP_FAILED) {
|
||||||
LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno));
|
LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno));
|
||||||
Release();
|
|
||||||
throw std::bad_alloc{};
|
throw std::bad_alloc{};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,9 +384,10 @@ public:
|
|||||||
mmap(nullptr, virtual_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
|
mmap(nullptr, virtual_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
|
||||||
if (virtual_base == MAP_FAILED) {
|
if (virtual_base == MAP_FAILED) {
|
||||||
LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno));
|
LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno));
|
||||||
Release();
|
|
||||||
throw std::bad_alloc{};
|
throw std::bad_alloc{};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
good = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
~Impl() {
|
~Impl() {
|
||||||
@ -397,10 +412,12 @@ public:
|
|||||||
|
|
||||||
void Protect(size_t virtual_offset, size_t length, bool read, bool write) {
|
void Protect(size_t virtual_offset, size_t length, bool read, bool write) {
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
if (read)
|
if (read) {
|
||||||
flags |= PROT_READ;
|
flags |= PROT_READ;
|
||||||
if (write)
|
}
|
||||||
|
if (write) {
|
||||||
flags |= PROT_WRITE;
|
flags |= PROT_WRITE;
|
||||||
|
}
|
||||||
int ret = mprotect(virtual_base + virtual_offset, length, flags);
|
int ret = mprotect(virtual_base + virtual_offset, length, flags);
|
||||||
ASSERT_MSG(ret == 0, "mprotect failed: {}", strerror(errno));
|
ASSERT_MSG(ret == 0, "mprotect failed: {}", strerror(errno));
|
||||||
}
|
}
|
||||||
@ -433,7 +450,7 @@ private:
|
|||||||
int fd{-1}; // memfd file descriptor, -1 is the error value of memfd_create
|
int fd{-1}; // memfd file descriptor, -1 is the error value of memfd_create
|
||||||
};
|
};
|
||||||
|
|
||||||
#else
|
#else // ^^^ Linux ^^^
|
||||||
|
|
||||||
#error Please implement the host memory for your platform
|
#error Please implement the host memory for your platform
|
||||||
|
|
||||||
|
@ -22,8 +22,8 @@ public:
|
|||||||
* Copy constructors. They shall return a copy of the buffer without the mappings.
|
* Copy constructors. They shall return a copy of the buffer without the mappings.
|
||||||
* TODO: Implement them with COW if needed.
|
* TODO: Implement them with COW if needed.
|
||||||
*/
|
*/
|
||||||
HostMemory(HostMemory& other) = delete;
|
HostMemory(const HostMemory& other) = delete;
|
||||||
HostMemory& operator=(HostMemory& other) = delete;
|
HostMemory& operator=(const HostMemory& other) = delete;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move constructors. They will move the buffer and the mappings to the new object.
|
* Move constructors. They will move the buffer and the mappings to the new object.
|
||||||
|
@ -41,10 +41,7 @@ class ServiceManager;
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Default number of maximum connections to a server session.
|
/// Default number of maximum connections to a server session.
|
||||||
static constexpr u32 ServerSessionCountMax = 0x40;
|
static constexpr u32 ServerSessionCountMax = 0x10000;
|
||||||
static_assert(ServerSessionCountMax == 0x40,
|
|
||||||
"ServerSessionCountMax isn't 0x40 somehow, this assert is a reminder that this will "
|
|
||||||
"break lots of things");
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is an non-templated base of ServiceFramework to reduce code bloat and compilation times, it
|
* This is an non-templated base of ServiceFramework to reduce code bloat and compilation times, it
|
||||||
|
Loading…
Reference in New Issue
Block a user