commit
08b0057754
|
@ -46,6 +46,15 @@ set(SYSTEMSERVICE_SOURCES src/Emulator/HLE/Libraries/LibSystemService/system_ser
|
||||||
src/Emulator/HLE/Libraries/LibSystemService/system_service.h
|
src/Emulator/HLE/Libraries/LibSystemService/system_service.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
set(FILESYSTEM_SOURCES src/Emulator/HLE/Libraries/LibKernel/FileSystem/file_system.cpp
|
||||||
|
src/Emulator/HLE/Libraries/LibKernel/FileSystem/file_system.h
|
||||||
|
src/Emulator/HLE/Libraries/LibKernel/FileSystem/posix_file_system.cpp
|
||||||
|
src/Emulator/HLE/Libraries/LibKernel/FileSystem/posix_file_system.h
|
||||||
|
src/Emulator/HLE/Libraries/LibKernel/FileSystem/generic_file_system.h
|
||||||
|
src/Emulator/HLE/Libraries/LibKernel/FileSystem/meta_file_system.h
|
||||||
|
src/Emulator/HLE/Libraries/LibKernel/FileSystem/meta_file_system.cpp
|
||||||
|
)
|
||||||
|
|
||||||
set(UTIL_SOURCES src/Emulator/Util/singleton.h
|
set(UTIL_SOURCES src/Emulator/Util/singleton.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -54,6 +63,7 @@ add_executable(shadps4
|
||||||
${USERSERVICE_SOURCES}
|
${USERSERVICE_SOURCES}
|
||||||
${PAD_SOURCES}
|
${PAD_SOURCES}
|
||||||
${SYSTEMSERVICE_SOURCES}
|
${SYSTEMSERVICE_SOURCES}
|
||||||
|
${FILESYSTEM_SOURCES}
|
||||||
${UTIL_SOURCES}
|
${UTIL_SOURCES}
|
||||||
src/main.cpp
|
src/main.cpp
|
||||||
src/types.h
|
src/types.h
|
||||||
|
@ -89,7 +99,7 @@ add_executable(shadps4
|
||||||
src/Core/PS4/HLE/Kernel/cpu_management.cpp
|
src/Core/PS4/HLE/Kernel/cpu_management.cpp
|
||||||
src/Core/PS4/HLE/Kernel/cpu_management.h
|
src/Core/PS4/HLE/Kernel/cpu_management.h
|
||||||
|
|
||||||
"src/Util/Disassembler.cpp" "src/Util/Disassembler.h" "src/Core/PS4/Util/aerolib.h" "src/Core/PS4/Loader/SymbolsResolver.h" "src/Core/PS4/Loader/SymbolsResolver.cpp" "src/Core/PS4/HLE/Libs.cpp" "src/Core/PS4/HLE/Libs.h" "src/Core/PS4/HLE/LibC.cpp" "src/Core/PS4/HLE/LibC.h" "src/Lib/Timer.cpp" "src/Lib/Timer.h" "src/Core/PS4/HLE/LibKernel.cpp" "src/Core/PS4/HLE/LibKernel.h" "src/Core/PS4/HLE/LibSceGnmDriver.cpp" "src/Core/PS4/HLE/LibSceGnmDriver.h" "src/Core/PS4/HLE/Kernel/ThreadManagement.cpp" "src/Core/PS4/HLE/Kernel/ThreadManagement.h" "src/Core/PS4/HLE/ErrorCodes.h" "src/debug.h" "src/Core/PS4/HLE/Kernel/memory_management.cpp" "src/Core/PS4/HLE/Kernel/memory_management.h" "src/Core/PS4/GPU/gpu_memory.cpp" "src/Core/PS4/GPU/gpu_memory.h" "src/emulator.cpp" "src/emulator.h" "src/Core/PS4/HLE/Kernel/Objects/event_queue.h" "src/Core/PS4/HLE/Kernel/Objects/event_queue.cpp" "src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.cpp" "src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.h" "src/Core/PS4/HLE/Graphics/graphics_ctx.h" "src/vulkan_util.cpp" "src/vulkan_util.h" "src/Core/PS4/GPU/video_out_buffer.cpp" "src/Core/PS4/GPU/video_out_buffer.h" "src/Core/PS4/HLE/Graphics/graphics_render.cpp" "src/Core/PS4/HLE/Graphics/graphics_render.h" "src/Core/PS4/GPU/tile_manager.cpp" "src/Core/PS4/GPU/tile_manager.h" "src/version.h" "src/Emulator/HLE/Libraries/LibSystemService/system_service.cpp" "src/Emulator/HLE/Libraries/LibSystemService/system_service.h")
|
"src/Util/Disassembler.cpp" "src/Util/Disassembler.h" "src/Core/PS4/Util/aerolib.h" "src/Core/PS4/Loader/SymbolsResolver.h" "src/Core/PS4/Loader/SymbolsResolver.cpp" "src/Core/PS4/HLE/Libs.cpp" "src/Core/PS4/HLE/Libs.h" "src/Core/PS4/HLE/LibC.cpp" "src/Core/PS4/HLE/LibC.h" "src/Lib/Timer.cpp" "src/Lib/Timer.h" "src/Core/PS4/HLE/LibKernel.cpp" "src/Core/PS4/HLE/LibKernel.h" "src/Core/PS4/HLE/LibSceGnmDriver.cpp" "src/Core/PS4/HLE/LibSceGnmDriver.h" "src/Core/PS4/HLE/Kernel/ThreadManagement.cpp" "src/Core/PS4/HLE/Kernel/ThreadManagement.h" "src/Core/PS4/HLE/ErrorCodes.h" "src/debug.h" "src/Core/PS4/HLE/Kernel/memory_management.cpp" "src/Core/PS4/HLE/Kernel/memory_management.h" "src/Core/PS4/GPU/gpu_memory.cpp" "src/Core/PS4/GPU/gpu_memory.h" "src/emulator.cpp" "src/emulator.h" "src/Core/PS4/HLE/Kernel/Objects/event_queue.h" "src/Core/PS4/HLE/Kernel/Objects/event_queue.cpp" "src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.cpp" "src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.h" "src/Core/PS4/HLE/Graphics/graphics_ctx.h" "src/vulkan_util.cpp" "src/vulkan_util.h" "src/Core/PS4/GPU/video_out_buffer.cpp" "src/Core/PS4/GPU/video_out_buffer.h" "src/Core/PS4/HLE/Graphics/graphics_render.cpp" "src/Core/PS4/HLE/Graphics/graphics_render.h" "src/Core/PS4/GPU/tile_manager.cpp" "src/Core/PS4/GPU/tile_manager.h" "src/version.h" "src/Emulator/HLE/Libraries/LibSystemService/system_service.cpp" "src/Emulator/HLE/Libraries/LibSystemService/system_service.h" "src/Emulator/HLE/Libraries/LibKernel/FileSystem/meta_file_system.h" "src/Emulator/HLE/Libraries/LibKernel/FileSystem/meta_file_system.cpp")
|
||||||
|
|
||||||
find_package(OpenGL REQUIRED)
|
find_package(OpenGL REQUIRED)
|
||||||
target_link_libraries(shadps4 PUBLIC fmt mincore spdlog IMGUI SDL3-shared ${OPENGL_LIBRARY} vulkan-1 spirv-tools-opt spirv-tools)
|
target_link_libraries(shadps4 PUBLIC fmt mincore spdlog IMGUI SDL3-shared ${OPENGL_LIBRARY} vulkan-1 spirv-tools-opt spirv-tools)
|
||||||
|
|
|
@ -84,6 +84,8 @@ void LibC_Register(SymbolsResolver* sym) {
|
||||||
LIB_FUNCTION("QI-x0SL8jhw", "libc", 1, "libc", 1, 1, Emulator::HLE::Libraries::LibC::acosf);
|
LIB_FUNCTION("QI-x0SL8jhw", "libc", 1, "libc", 1, 1, Emulator::HLE::Libraries::LibC::acosf);
|
||||||
LIB_FUNCTION("ZE6RNL+eLbk", "libc", 1, "libc", 1, 1, Emulator::HLE::Libraries::LibC::tanf);
|
LIB_FUNCTION("ZE6RNL+eLbk", "libc", 1, "libc", 1, 1, Emulator::HLE::Libraries::LibC::tanf);
|
||||||
LIB_FUNCTION("GZWjF-YIFFk", "libc", 1, "libc", 1, 1, Emulator::HLE::Libraries::LibC::asinf);
|
LIB_FUNCTION("GZWjF-YIFFk", "libc", 1, "libc", 1, 1, Emulator::HLE::Libraries::LibC::asinf);
|
||||||
|
LIB_FUNCTION("9LCjpWyQ5Zc", "libc", 1, "libc", 1, 1, Emulator::HLE::Libraries::LibC::pow);
|
||||||
|
LIB_FUNCTION("cCXjU72Z0Ow", "libc", 1, "libc", 1, 1, Emulator::HLE::Libraries::LibC::_Sin);
|
||||||
|
|
||||||
LIB_OBJ("P330P3dFF68", "libc", 1, "libc", 1, 1, &HLE::Libs::LibC::g_need_sceLibc);
|
LIB_OBJ("P330P3dFF68", "libc", 1, "libc", 1, 1, &HLE::Libs::LibC::g_need_sceLibc);
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
#include "Kernel/event_queues.h"
|
#include "Kernel/event_queues.h"
|
||||||
#include "Kernel/memory_management.h"
|
#include "Kernel/memory_management.h"
|
||||||
#include "Libs.h"
|
#include "Libs.h"
|
||||||
|
#include "Emulator/HLE/Libraries/LibKernel/FileSystem/file_system.h"
|
||||||
|
#include "Emulator/HLE/Libraries/LibKernel/FileSystem/posix_file_system.h"
|
||||||
|
|
||||||
namespace HLE::Libs::LibKernel {
|
namespace HLE::Libs::LibKernel {
|
||||||
|
|
||||||
|
@ -44,6 +46,9 @@ void LibKernel_Register(SymbolsResolver* sym) {
|
||||||
LIB_FUNCTION("Ou3iL1abvng", "libkernel", 1, "libkernel", 1, 1, stack_chk_fail);
|
LIB_FUNCTION("Ou3iL1abvng", "libkernel", 1, "libkernel", 1, 1, stack_chk_fail);
|
||||||
// time
|
// time
|
||||||
LIB_FUNCTION("-2IRUCO--PM", "libkernel", 1, "libkernel", 1, 1, sceKernelReadTsc);
|
LIB_FUNCTION("-2IRUCO--PM", "libkernel", 1, "libkernel", 1, 1, sceKernelReadTsc);
|
||||||
|
// fs
|
||||||
|
LIB_FUNCTION("1G3lF1Gg1k8", "libkernel", 1, "libkernel", 1, 1, Emulator::HLE::Libraries::LibKernel::FileSystem::sceKernelOpen);
|
||||||
|
LIB_FUNCTION("wuCroIGjt2g", "libScePosix", 1, "libkernel", 1, 1, Emulator::HLE::Libraries::LibKernel::FileSystem::POSIX::open);
|
||||||
}
|
}
|
||||||
|
|
||||||
}; // namespace HLE::Libs::LibKernel
|
}; // namespace HLE::Libs::LibKernel
|
|
@ -206,8 +206,8 @@ bool Elf::isElfFile() const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_elf_header->e_type != ET_SCE_DYNEXEC && m_elf_header->e_type != ET_SCE_DYNAMIC) {
|
if (m_elf_header->e_type != ET_SCE_DYNEXEC&& m_elf_header->e_type != ET_SCE_DYNAMIC&& m_elf_header->e_type != ET_SCE_EXEC) {
|
||||||
printf("ERROR:e_type expected 0xFE10 OR 0xFE18 is (%04x)\n", m_elf_header->e_type);
|
printf("ERROR:e_type expected 0xFE10 OR 0xFE18 OR 0xfe00 is (%04x)\n", m_elf_header->e_type);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,4 +55,9 @@ float PS4_SYSV_ABI acosf(float num) { return std::acosf(num); }
|
||||||
float PS4_SYSV_ABI tanf(float num) { return std::tanf(num); }
|
float PS4_SYSV_ABI tanf(float num) { return std::tanf(num); }
|
||||||
|
|
||||||
float PS4_SYSV_ABI asinf(float num) { return std::asinf(num); }
|
float PS4_SYSV_ABI asinf(float num) { return std::asinf(num); }
|
||||||
|
|
||||||
|
double PS4_SYSV_ABI pow(double base, double exponent) { return std::pow(base, exponent); }
|
||||||
|
|
||||||
|
double PS4_SYSV_ABI _Sin(double x) { return std::sin(x); }
|
||||||
|
|
||||||
}; // namespace Emulator::HLE::Libraries::LibC
|
}; // namespace Emulator::HLE::Libraries::LibC
|
|
@ -26,5 +26,7 @@ float PS4_SYSV_ABI atan2f(float y, float x);
|
||||||
float PS4_SYSV_ABI acosf(float num);
|
float PS4_SYSV_ABI acosf(float num);
|
||||||
float PS4_SYSV_ABI tanf(float num);
|
float PS4_SYSV_ABI tanf(float num);
|
||||||
float PS4_SYSV_ABI asinf(float num);
|
float PS4_SYSV_ABI asinf(float num);
|
||||||
|
double PS4_SYSV_ABI pow(double base, double exponent);
|
||||||
|
double PS4_SYSV_ABI _Sin(double x);
|
||||||
|
|
||||||
} // namespace Emulator::HLE::Libraries::LibC
|
} // namespace Emulator::HLE::Libraries::LibC
|
|
@ -0,0 +1,13 @@
|
||||||
|
#include "file_system.h"
|
||||||
|
#include <debug.h>
|
||||||
|
#include <Util/log.h>
|
||||||
|
|
||||||
|
namespace Emulator::HLE::Libraries::LibKernel::FileSystem {
|
||||||
|
constexpr bool log_file_fs = true; // disable it to disable logging
|
||||||
|
|
||||||
|
int PS4_SYSV_ABI sceKernelOpen(const char* path, int flags, u16 mode) {
|
||||||
|
LOG_INFO_IF(log_file_fs, "sceKernelOpen path = {} flags = {} mode = {}\n", path, log_hex_full(flags), log_hex_full(mode));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Emulator::HLE::Libraries::LibKernel::FileSystem
|
|
@ -0,0 +1,7 @@
|
||||||
|
#pragma once
|
||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
namespace Emulator::HLE::Libraries::LibKernel::FileSystem {
|
||||||
|
int PS4_SYSV_ABI sceKernelOpen(const char *path, int flags, /* SceKernelMode*/ u16 mode);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
#pragma once
|
||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace Emulator::Host::GenericFS {
|
||||||
|
|
||||||
|
enum FileAccess {
|
||||||
|
FILEACCESS_READ = 0,
|
||||||
|
FILEACCESS_WRITE = 1,
|
||||||
|
FILEACCESS_READWRITE = 2
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class GenericHandleAllocator {
|
||||||
|
public:
|
||||||
|
virtual u32 requestHandle() = 0;
|
||||||
|
virtual void releaseHandle(u32 handle) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class AbstractFileSystem {
|
||||||
|
public:
|
||||||
|
virtual bool ownsHandle(u32 handle) = 0;
|
||||||
|
virtual u32 openFile(std::string filename, FileAccess access) = 0;
|
||||||
|
virtual void closeFile(u32 handle) = 0;
|
||||||
|
};
|
||||||
|
} // namespace Emulator::Host::GenericFS
|
|
@ -0,0 +1,52 @@
|
||||||
|
#include "meta_file_system.h"
|
||||||
|
|
||||||
|
namespace Emulator::Host::GenericFS {
|
||||||
|
|
||||||
|
void MetaFileSystem::mount(std::string prefix, AbstractFileSystem* system) {
|
||||||
|
System x;
|
||||||
|
x.prefix = prefix;
|
||||||
|
x.system = system;
|
||||||
|
fileSystems.push_back(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MetaFileSystem::unMount(AbstractFileSystem* system) {}
|
||||||
|
|
||||||
|
void MetaFileSystem::unMountAll() { fileSystems.clear(); }
|
||||||
|
|
||||||
|
AbstractFileSystem* MetaFileSystem::getHandleOwner(u32 handle) {
|
||||||
|
for (u32 i = 0; i < fileSystems.size(); i++) {
|
||||||
|
if (fileSystems[i].system->ownsHandle(handle)) return fileSystems[i].system; // got it!
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MetaFileSystem::mapFilePath(std::string inpath, std::string* outpath, AbstractFileSystem** system) {
|
||||||
|
for (unsigned int i = 0; i < fileSystems.size(); i++) {
|
||||||
|
int prefLen = fileSystems[i].prefix.size();
|
||||||
|
if (fileSystems[i].prefix == inpath.substr(0, prefLen))
|
||||||
|
{
|
||||||
|
*outpath = inpath.substr(prefLen);
|
||||||
|
*system = fileSystems[i].system;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 MetaFileSystem::openFile(std::string filename, FileAccess access) {
|
||||||
|
AbstractFileSystem* system;
|
||||||
|
std::string of;
|
||||||
|
if (mapFilePath(filename, &of, &system)) {
|
||||||
|
return system->openFile(of, access);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MetaFileSystem::closeFile(u32 handle) {
|
||||||
|
AbstractFileSystem* sys = getHandleOwner(handle);
|
||||||
|
if (sys) sys->closeFile(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Emulator::Host::GenericFS
|
|
@ -0,0 +1,40 @@
|
||||||
|
#pragma once
|
||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "generic_file_system.h"
|
||||||
|
|
||||||
|
namespace Emulator::Host::GenericFS {
|
||||||
|
|
||||||
|
class MetaFileSystem : public GenericHandleAllocator, AbstractFileSystem {
|
||||||
|
struct System {
|
||||||
|
std::string prefix;
|
||||||
|
AbstractFileSystem *system;
|
||||||
|
};
|
||||||
|
|
||||||
|
u32 current;
|
||||||
|
std::vector<System> fileSystems;
|
||||||
|
std::string currentDirectory;
|
||||||
|
std::vector<u32> handler;
|
||||||
|
|
||||||
|
public:
|
||||||
|
MetaFileSystem() : current(0) {}
|
||||||
|
|
||||||
|
void mount(std::string prefix, AbstractFileSystem *system);
|
||||||
|
void unMount(AbstractFileSystem *system);
|
||||||
|
void unMountAll();
|
||||||
|
AbstractFileSystem *getHandleOwner(u32 handle);
|
||||||
|
bool mapFilePath(std::string inpath, std::string *outpath, AbstractFileSystem **system);
|
||||||
|
u32 requestHandle() {
|
||||||
|
handler.push_back(current);
|
||||||
|
current++;
|
||||||
|
return handler.back();
|
||||||
|
}
|
||||||
|
void releaseHandle(u32 handle) { handler.erase(std::remove(handler.begin(), handler.end(), handle), handler.end()); }
|
||||||
|
bool ownsHandle(u32 handle) { return false; }
|
||||||
|
u32 openFile(std::string filename, FileAccess access);
|
||||||
|
void closeFile(u32 handle);
|
||||||
|
};
|
||||||
|
} // namespace Emulator::Host::GenericFS
|
|
@ -0,0 +1,15 @@
|
||||||
|
#include "posix_file_system.h"
|
||||||
|
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include "file_system.h"
|
||||||
|
|
||||||
|
namespace Emulator::HLE::Libraries::LibKernel::FileSystem::POSIX {
|
||||||
|
int PS4_SYSV_ABI open(const char* path, int flags, /* SceKernelMode*/ u16 mode) {
|
||||||
|
int result = sceKernelOpen(path, flags, mode);
|
||||||
|
if (result < 0) {
|
||||||
|
BREAKPOINT(); // posix calls different only for their return values
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
} // namespace Emulator::HLE::Libraries::LibKernel::FileSystem::POSIX
|
|
@ -0,0 +1,6 @@
|
||||||
|
#pragma once
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
namespace Emulator::HLE::Libraries::LibKernel::FileSystem::POSIX {
|
||||||
|
int PS4_SYSV_ABI open(const char *path, int flags, /* SceKernelMode*/ u16 mode);
|
||||||
|
}
|
Loading…
Reference in New Issue