mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 20:31:14 +00:00
emummc: fix for svcQueryIoMapping abi change
This commit is contained in:
parent
6fe8ada37a
commit
c07f54f370
8 changed files with 37 additions and 8 deletions
|
@ -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;
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -38,9 +38,16 @@ 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) {
|
||||||
|
u64 out_size;
|
||||||
|
if (svcQueryIoMapping(&vaddr, &out_size, aligned_addr, aligned_size) != 0) {
|
||||||
fatal_abort(Fatal_IoMapping);
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -26,7 +26,7 @@ namespace ams::dd {
|
||||||
u64 region_size;
|
u64 region_size;
|
||||||
R_TRY_CATCH(svcQueryIoMapping(&virtual_addr, ®ion_size, aligned_addr, aligned_size)) {
|
R_TRY_CATCH(svcQueryIoMapping(&virtual_addr, ®ion_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 {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue