emummc: fix for svcQueryIoMapping abi change

This commit is contained in:
Michael Scire 2020-04-14 11:15:19 -07:00
parent 6fe8ada37a
commit c07f54f370
8 changed files with 37 additions and 8 deletions

View file

@ -36,7 +36,6 @@ sdmmc_storage_t sd_storage;
// init vars // init vars
bool custom_driver = true; bool custom_driver = true;
extern const volatile emuMMC_ctx_t emuMMC_ctx;
// FS funcs // FS funcs
_sdmmc_accessor_gc sdmmc_accessor_gc; _sdmmc_accessor_gc sdmmc_accessor_gc;
@ -344,7 +343,7 @@ uint64_t sdmmc_wrapper_controller_close(int mmc_id)
{ {
return 0; return 0;
} }
if (mmc_id == FS_SDMMC_EMMC) if (mmc_id == FS_SDMMC_EMMC)
{ {
// Close file handles and unmount // Close file handles and unmount

View file

@ -50,8 +50,18 @@ extern "C" {
* @return Result code. * @return Result code.
* @note Syscall number 0x55. * @note Syscall number 0x55.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
* @warning Only exists on [10.0.0+]. For older versions use \ref svcLegacyQueryIoMapping.
*/ */
Result svcQueryIoMapping(u64* virtaddr, u64 physaddr, u64 size); Result svcQueryIoMapping(u64* virtaddr, u64* out_size, u64 physaddr, u64 size);
/**
* @brief Returns a virtual address mapped to a given IO range.
* @return Result code.
* @note Syscall number 0x55.
* @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available.
* @warning Only exists on [1.0.0-9.2.0]. For newer versions use \ref svcQueryIoMapping.
*/
Result svcLegacyQueryIoMapping(u64* virtaddr, u64 physaddr, u64 size);
/** /**
* @brief Attaches a device address space to a device. * @brief Attaches a device address space to a device.

View file

@ -17,6 +17,15 @@
.endm .endm
SVC_BEGIN svcQueryIoMapping SVC_BEGIN svcQueryIoMapping
STP X0, X1, [SP, #-16]!
SVC 0x55
LDP X3, X4, [SP], #16
STR X1, [X3]
STR X2, [X4]
RET
SVC_END
SVC_BEGIN svcLegacyQueryIoMapping
STR X0, [SP, #-16]! STR X0, [SP, #-16]!
SVC 0x55 SVC 0x55
LDR X2, [SP], #16 LDR X2, [SP], #16

View file

@ -25,11 +25,12 @@ enum FatalReason
Fatal_InvalidAccessor, Fatal_InvalidAccessor,
Fatal_ReadNoAccessor, Fatal_ReadNoAccessor,
Fatal_WriteNoAccessor, Fatal_WriteNoAccessor,
Fatal_IoMapping, Fatal_IoMappingLegacy,
Fatal_UnknownVersion, Fatal_UnknownVersion,
Fatal_BadResult, Fatal_BadResult,
Fatal_GetConfig, Fatal_GetConfig,
Fatal_CloseAccessor, Fatal_CloseAccessor,
Fatal_IoMapping,
Fatal_Max Fatal_Max
}; };

View file

@ -38,8 +38,15 @@ static inline uintptr_t _GetIoMapping(u64 io_addr, u64 io_size)
u64 vaddr; u64 vaddr;
u64 aligned_addr = (io_addr & ~0xFFFul); u64 aligned_addr = (io_addr & ~0xFFFul);
u64 aligned_size = io_size + (io_addr - aligned_addr); u64 aligned_size = io_size + (io_addr - aligned_addr);
if (svcQueryIoMapping(&vaddr, aligned_addr, aligned_size) != 0) { if (emuMMC_ctx.fs_ver >= FS_VER_10_0_0) {
fatal_abort(Fatal_IoMapping); u64 out_size;
if (svcQueryIoMapping(&vaddr, &out_size, aligned_addr, aligned_size) != 0) {
fatal_abort(Fatal_IoMapping);
}
} else {
if (svcLegacyQueryIoMapping(&vaddr, aligned_addr, aligned_size) != 0) {
fatal_abort(Fatal_IoMappingLegacy);
}
} }
return (uintptr_t)(vaddr + (io_addr - aligned_addr)); return (uintptr_t)(vaddr + (io_addr - aligned_addr));
} }

View file

@ -19,6 +19,7 @@
#define _UTIL_H_ #define _UTIL_H_
#include "types.h" #include "types.h"
#include "../emuMMC/emummc_ctx.h"
intptr_t QueryIoMapping(u64 addr, u64 size); intptr_t QueryIoMapping(u64 addr, u64 size);
#define byte_swap_32(num) ((num >> 24) & 0xff) | ((num << 8) & 0xff0000) | \ #define byte_swap_32(num) ((num >> 24) & 0xff) | ((num << 8) & 0xff0000) | \
@ -37,4 +38,6 @@ void usleep(u64 ticks);
void msleep(u64 milliseconds); void msleep(u64 milliseconds);
void exec_cfg(u32 *base, const cfg_op_t *ops, u32 num_ops); void exec_cfg(u32 *base, const cfg_op_t *ops, u32 num_ops);
extern volatile emuMMC_ctx_t emuMMC_ctx;
#endif #endif

View file

@ -26,7 +26,7 @@ namespace ams::dd {
u64 region_size; u64 region_size;
R_TRY_CATCH(svcQueryIoMapping(&virtual_addr, &region_size, aligned_addr, aligned_size)) { R_TRY_CATCH(svcQueryIoMapping(&virtual_addr, &region_size, aligned_addr, aligned_size)) {
/* Official software handles this by returning 0. */ /* Official software handles this by returning 0. */
R_CATCH(svc::ResultNotFound) { exosphere::ForceRebootToRcm(); return 0; } R_CATCH(svc::ResultNotFound) { return 0; }
} R_END_TRY_CATCH_WITH_ABORT_UNLESS; } R_END_TRY_CATCH_WITH_ABORT_UNLESS;
AMS_ASSERT(region_size >= aligned_size); AMS_ASSERT(region_size >= aligned_size);
} else { } else {

View file

@ -66,7 +66,7 @@ namespace {
} }
void InitializeHeap() { void InitializeHeap() {
g_heap_handle = lmem::CreateExpHeap(g_heap_memory, sizeof(g_heap_memory), lmem::CreateOption_None); g_heap_handle = lmem::CreateExpHeap(g_heap_memory, sizeof(g_heap_memory), lmem::CreateOption_ThreadSafe);
ncm::GetHeapState().Initialize(g_heap_handle); ncm::GetHeapState().Initialize(g_heap_handle);
} }