Compare commits
94 Commits
11_support
...
0.16.0-p2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7336dc2b7a | ||
|
|
d2f48d5e36 | ||
|
|
422e9434d8 | ||
|
|
2b93bbd9ee | ||
|
|
021b29d2db | ||
|
|
6da28f4a27 | ||
|
|
bba99d49da | ||
|
|
e760a9d4b0 | ||
|
|
ee91f3fde0 | ||
|
|
f72475872a | ||
|
|
199a9aec8b | ||
|
|
1b83f5169a | ||
|
|
7bb77f44af | ||
|
|
801ce24622 | ||
|
|
1d778b2dc8 | ||
|
|
7c9608021d | ||
|
|
b8fbd0baff | ||
|
|
525da05629 | ||
|
|
2e9db4d113 | ||
|
|
4f1a4e7499 | ||
|
|
972283032a | ||
|
|
57f935391d | ||
|
|
4804e1e1e0 | ||
|
|
4ae74b9b4e | ||
|
|
726d7b6e4d | ||
|
|
390bdc7b6b | ||
|
|
2d8acf9c64 | ||
|
|
9743f63f0d | ||
|
|
ccd2798ae2 | ||
|
|
f3dbab4876 | ||
|
|
41a53075e5 | ||
|
|
ab8de72db0 | ||
|
|
331fa1d00d | ||
|
|
fd745ab2d3 | ||
|
|
972b396f61 | ||
|
|
3c8e7de915 | ||
|
|
1b164613a6 | ||
|
|
3d4ab95ab2 | ||
|
|
152def19c0 | ||
|
|
63974d9bce | ||
|
|
2b483866c7 | ||
|
|
7e1da15f6e | ||
|
|
0a1465f198 | ||
|
|
748893fe77 | ||
|
|
1ca64cf2a1 | ||
|
|
aac8af8bf5 | ||
|
|
5da6b60008 | ||
|
|
e400e2afc7 | ||
|
|
56c6e4244a | ||
|
|
c8ebd7eea0 | ||
|
|
550f5690bf | ||
|
|
28f9b534b6 | ||
|
|
3fd59b61bc | ||
|
|
f86059de70 | ||
|
|
a03ee7b148 | ||
|
|
8b2ed36698 | ||
|
|
1852fe8612 | ||
|
|
b60054dba1 | ||
|
|
c7f37f81ee | ||
|
|
19a279ce45 | ||
|
|
783f1077be | ||
|
|
b0debd72a7 | ||
|
|
24d545701c | ||
|
|
aae565629e | ||
|
|
bee629b8ad | ||
|
|
5cb237d030 | ||
|
|
a4e09fc6c4 | ||
|
|
73d9d5ff47 | ||
|
|
08cfee54fa | ||
|
|
7b279ab863 | ||
|
|
6a85f7225d | ||
|
|
f469dfbeb3 | ||
|
|
cc11d452e5 | ||
|
|
3bce008170 | ||
|
|
3383509da6 | ||
|
|
281dcf232a | ||
|
|
71a2fe1bb6 | ||
|
|
4a216dc928 | ||
|
|
18099e19b1 | ||
|
|
a0a45853dd | ||
|
|
fe9a4cd2fc | ||
|
|
88a66c89e2 | ||
|
|
93128b6b17 | ||
|
|
db2de8ef31 | ||
|
|
05832cec73 | ||
|
|
632c8984c8 | ||
|
|
694e3b579e | ||
|
|
20eba0dc98 | ||
|
|
730ef6d6db | ||
|
|
7cb24713ab | ||
|
|
a685842804 | ||
|
|
ad6dd60474 | ||
|
|
05af215191 | ||
|
|
e06b73aafa |
@@ -1,4 +1,38 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
## 0.16.0
|
||||||
|
+ Support was added for 11.0.0.
|
||||||
|
+ `exosphère` was updated to reflect the latest official secure monitor behavior.
|
||||||
|
+ `mesosphère` was updated to reflect the latest official kernel behavior.
|
||||||
|
+ `loader`, `sm`, `boot`, `pgl` were updated to reflect the latest official behaviors.
|
||||||
|
+ **Please Note**: 11.0.0 implements an opt-in version of the atmosphère `sm` extension that allows for closing session without unregistering services.
|
||||||
|
+ Correspondingly, the extension will be deprecated in favor of the new official opt-in command. In 0.17.0, it will be removed entirely.
|
||||||
|
+ If your custom system module relies on this extension (however unlikely that seems to me), please update it accordingly.
|
||||||
|
+ `erpt` was partially updated to provide compatibility with 11.0.0.
|
||||||
|
+ The latest firmware attaches additional fields and context information to logs.
|
||||||
|
+ A future atmosphère update will implement this logic, so that users who are interested can also get the new information when examining their logs.
|
||||||
|
+ **Please Note**: 11.0.0 introduced breaking changes to the `usb` system module's `usb:ds` API.
|
||||||
|
+ Homebrew which uses the `usb:ds` service should rebuild with the latest libnx version to support running on 11.0.0.
|
||||||
|
+ The `boot` system module was rewritten to reflect the huge driver changes introduced in 8.0.0.
|
||||||
|
+ This includes a number of improvements to both logo display and battery management logic.
|
||||||
|
+ Support was added for configuring the address space width for `hbl`.
|
||||||
|
+ The `hbl_config!override_address_space_(#)` and `hbl_config!override_any_app_address_space` can now be set to `39_bit`, `36_bit`, or `32_bit` to control the address space for hbl on a per-override basis.
|
||||||
|
+ If a configuration has not been set, hbl will now default to 39-bit address space.
|
||||||
|
+ Previously, a legacy 36-bit address space was always used to maintain compatibility with 1.0.0.
|
||||||
|
+ A new loader extension was added to support 39-bit whenever possible (including mesosphere-on-1.0.0), with fallback to 36-bit when unavailable.
|
||||||
|
+ Support was added to a number of components for running on Mariko hardware.
|
||||||
|
+ The `boot` system module can now safely be run on mariko hardware, performing correct hardware initialization.
|
||||||
|
+ Daybreak (and generally, system update logic) were updated to be usable on Mariko.
|
||||||
|
+ Boot0 protection/management logic was updated to perform correct actions on Mariko.
|
||||||
|
+ Reboot to payload does not and cannot work on Mariko. Correspondingly, A "fatal error" handler was written, to display and save fatal errors from within TrustZone.
|
||||||
|
+ **Please Note:** Atmosphere is still not properly usable on Mariko hardware.
|
||||||
|
+ In particular, wake-from-sleep will not properly function (the magic numbers aren't set correctly), among a few other minor issues.
|
||||||
|
+ `exosphère` received support for building under debug configuration.
|
||||||
|
+ A small (otherwise unused) portion of IRAM is now reserved for debug-only exosphere code (this region is unused/untouched under release config).
|
||||||
|
+ This enables logging (including printf) to uart from the secure monitor, for those interested.
|
||||||
|
+ A number of bugs were fixed, including:
|
||||||
|
+ Minor issues in a number of filesystem related code were fixed.
|
||||||
|
+ An issue was fixed that could cause NCM to abort on consoles which came with 3.0.x and were never updated.
|
||||||
|
+ Several issues were fixed, and usability and stability were improved.
|
||||||
## 0.15.0
|
## 0.15.0
|
||||||
+ fusee-primary's panic display was updated to automatically identify and give suggestions to resolve many of the most common errors users encounter.
|
+ fusee-primary's panic display was updated to automatically identify and give suggestions to resolve many of the most common errors users encounter.
|
||||||
+ Having been tested as well as I can alone, `mesosphere` (atmosphère's reimplementation of the Nintendo Switch kernel) is now available for users interested in trying it.
|
+ Having been tested as well as I can alone, `mesosphere` (atmosphère's reimplementation of the Nintendo Switch kernel) is now available for users interested in trying it.
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
[subrepo]
|
[subrepo]
|
||||||
remote = https://github.com/m4xw/emuMMC
|
remote = https://github.com/m4xw/emuMMC
|
||||||
branch = develop
|
branch = develop
|
||||||
commit = 25075973d31a5be6f2e769f1ea0fff44daf0cdfa
|
commit = 5eed18eb527bbaa63aee5323c26de5b0cca6d28e
|
||||||
parent = 8ba513fefbcfd8278a433090e59017963ba9887f
|
parent = 021b29d2dbc8ed0469bc822393e58c9f0d174d57
|
||||||
method = rebase
|
method = rebase
|
||||||
cmdver = 0.4.1
|
cmdver = 0.4.1
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
*A SDMMC driver replacement for Nintendo's Filesystem Services, by **m4xw***
|
*A SDMMC driver replacement for Nintendo's Filesystem Services, by **m4xw***
|
||||||
|
|
||||||
### Supported Horizon Versions
|
### Supported Horizon Versions
|
||||||
**1.0.0 - 10.0.0**
|
**1.0.0 - 11.0.0**
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
* Arbitrary SDMMC backend selection
|
* Arbitrary SDMMC backend selection
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ static const fs_offsets_t GET_OFFSET_STRUCT_NAME(vers) = { \
|
|||||||
.nand_mutex = FS_OFFSET##vers##_NAND_MUTEX, \
|
.nand_mutex = FS_OFFSET##vers##_NAND_MUTEX, \
|
||||||
.active_partition = FS_OFFSET##vers##_ACTIVE_PARTITION, \
|
.active_partition = FS_OFFSET##vers##_ACTIVE_PARTITION, \
|
||||||
.sdmmc_das_handle = FS_OFFSET##vers##_SDMMC_DAS_HANDLE, \
|
.sdmmc_das_handle = FS_OFFSET##vers##_SDMMC_DAS_HANDLE, \
|
||||||
|
.sdmmc_accessor_controller_open = FS_OFFSET##vers##_SDMMC_WRAPPER_CONTROLLER_OPEN, \
|
||||||
.sdmmc_accessor_controller_close = FS_OFFSET##vers##_SDMMC_WRAPPER_CONTROLLER_CLOSE, \
|
.sdmmc_accessor_controller_close = FS_OFFSET##vers##_SDMMC_WRAPPER_CONTROLLER_CLOSE, \
|
||||||
.sd_das_init = FS_OFFSET##vers##_SD_DAS_INIT, \
|
.sd_das_init = FS_OFFSET##vers##_SD_DAS_INIT, \
|
||||||
.nintendo_paths = FS_OFFSET##vers##_NINTENDO_PATHS, \
|
.nintendo_paths = FS_OFFSET##vers##_NINTENDO_PATHS, \
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ typedef struct {
|
|||||||
// Misc funcs
|
// Misc funcs
|
||||||
uintptr_t lock_mutex;
|
uintptr_t lock_mutex;
|
||||||
uintptr_t unlock_mutex;
|
uintptr_t unlock_mutex;
|
||||||
|
uintptr_t sdmmc_accessor_controller_open;
|
||||||
uintptr_t sdmmc_accessor_controller_close;
|
uintptr_t sdmmc_accessor_controller_close;
|
||||||
// Misc data
|
// Misc data
|
||||||
uintptr_t sd_mutex;
|
uintptr_t sd_mutex;
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ typedef struct sdmmc_accessor_vt
|
|||||||
void *dtor;
|
void *dtor;
|
||||||
void *map_device_addr_space;
|
void *map_device_addr_space;
|
||||||
void *unmap_device_addr_space;
|
void *unmap_device_addr_space;
|
||||||
void *controller_open;
|
uint64_t (*sdmmc_accessor_controller_open)(void *);
|
||||||
uint64_t (*sdmmc_accessor_controller_close)(void *);
|
uint64_t (*sdmmc_accessor_controller_close)(void *);
|
||||||
uint64_t (*read_write)(void *, uint64_t, uint64_t, void *, uint64_t, uint64_t);
|
uint64_t (*read_write)(void *, uint64_t, uint64_t, void *, uint64_t, uint64_t);
|
||||||
// More not included because we don't use it.
|
// More not included because we don't use it.
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_100_LOCK_MUTEX 0x2884
|
#define FS_OFFSET_100_LOCK_MUTEX 0x2884
|
||||||
#define FS_OFFSET_100_UNLOCK_MUTEX 0x28F0
|
#define FS_OFFSET_100_UNLOCK_MUTEX 0x28F0
|
||||||
|
|
||||||
|
#define FS_OFFSET_100_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_100_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x6A8AC
|
#define FS_OFFSET_100_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x6A8AC
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_1000_LOCK_MUTEX 0x28910
|
#define FS_OFFSET_1000_LOCK_MUTEX 0x28910
|
||||||
#define FS_OFFSET_1000_UNLOCK_MUTEX 0x28960
|
#define FS_OFFSET_1000_UNLOCK_MUTEX 0x28960
|
||||||
|
|
||||||
|
#define FS_OFFSET_1000_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_1000_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1422E0
|
#define FS_OFFSET_1000_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1422E0
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_1000_EXFAT_LOCK_MUTEX 0x28910
|
#define FS_OFFSET_1000_EXFAT_LOCK_MUTEX 0x28910
|
||||||
#define FS_OFFSET_1000_EXFAT_UNLOCK_MUTEX 0x28960
|
#define FS_OFFSET_1000_EXFAT_UNLOCK_MUTEX 0x28960
|
||||||
|
|
||||||
|
#define FS_OFFSET_1000_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_1000_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1422E0
|
#define FS_OFFSET_1000_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1422E0
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_1020_LOCK_MUTEX 0x28910
|
#define FS_OFFSET_1020_LOCK_MUTEX 0x28910
|
||||||
#define FS_OFFSET_1020_UNLOCK_MUTEX 0x28960
|
#define FS_OFFSET_1020_UNLOCK_MUTEX 0x28960
|
||||||
|
|
||||||
|
#define FS_OFFSET_1020_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_1020_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x142740
|
#define FS_OFFSET_1020_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x142740
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_1020_EXFAT_LOCK_MUTEX 0x28910
|
#define FS_OFFSET_1020_EXFAT_LOCK_MUTEX 0x28910
|
||||||
#define FS_OFFSET_1020_EXFAT_UNLOCK_MUTEX 0x28960
|
#define FS_OFFSET_1020_EXFAT_UNLOCK_MUTEX 0x28960
|
||||||
|
|
||||||
|
#define FS_OFFSET_1020_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_1020_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x142740
|
#define FS_OFFSET_1020_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x142740
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_1100_LOCK_MUTEX 0x28FF0
|
#define FS_OFFSET_1100_LOCK_MUTEX 0x28FF0
|
||||||
#define FS_OFFSET_1100_UNLOCK_MUTEX 0x29040
|
#define FS_OFFSET_1100_UNLOCK_MUTEX 0x29040
|
||||||
|
|
||||||
|
#define FS_OFFSET_1100_SDMMC_WRAPPER_CONTROLLER_OPEN 0x14B840
|
||||||
#define FS_OFFSET_1100_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x14B8F0
|
#define FS_OFFSET_1100_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x14B8F0
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_1100_EXFAT_LOCK_MUTEX 0x28FF0
|
#define FS_OFFSET_1100_EXFAT_LOCK_MUTEX 0x28FF0
|
||||||
#define FS_OFFSET_1100_EXFAT_UNLOCK_MUTEX 0x29040
|
#define FS_OFFSET_1100_EXFAT_UNLOCK_MUTEX 0x29040
|
||||||
|
|
||||||
|
#define FS_OFFSET_1100_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0x14B840
|
||||||
#define FS_OFFSET_1100_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x14B8F0
|
#define FS_OFFSET_1100_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x14B8F0
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_200_LOCK_MUTEX 0x3264
|
#define FS_OFFSET_200_LOCK_MUTEX 0x3264
|
||||||
#define FS_OFFSET_200_UNLOCK_MUTEX 0x32D0
|
#define FS_OFFSET_200_UNLOCK_MUTEX 0x32D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_200_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_200_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x733F4
|
#define FS_OFFSET_200_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x733F4
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_200_EXFAT_LOCK_MUTEX 0x3264
|
#define FS_OFFSET_200_EXFAT_LOCK_MUTEX 0x3264
|
||||||
#define FS_OFFSET_200_EXFAT_UNLOCK_MUTEX 0x32D0
|
#define FS_OFFSET_200_EXFAT_UNLOCK_MUTEX 0x32D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_200_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_200_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x733F4
|
#define FS_OFFSET_200_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x733F4
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_210_LOCK_MUTEX 0x3264
|
#define FS_OFFSET_210_LOCK_MUTEX 0x3264
|
||||||
#define FS_OFFSET_210_UNLOCK_MUTEX 0x32D0
|
#define FS_OFFSET_210_UNLOCK_MUTEX 0x32D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_210_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_210_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x737D4
|
#define FS_OFFSET_210_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x737D4
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_210_EXFAT_LOCK_MUTEX 0x3264
|
#define FS_OFFSET_210_EXFAT_LOCK_MUTEX 0x3264
|
||||||
#define FS_OFFSET_210_EXFAT_UNLOCK_MUTEX 0x32D0
|
#define FS_OFFSET_210_EXFAT_UNLOCK_MUTEX 0x32D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_210_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_210_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x737D4
|
#define FS_OFFSET_210_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x737D4
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_300_LOCK_MUTEX 0x35CC
|
#define FS_OFFSET_300_LOCK_MUTEX 0x35CC
|
||||||
#define FS_OFFSET_300_UNLOCK_MUTEX 0x3638
|
#define FS_OFFSET_300_UNLOCK_MUTEX 0x3638
|
||||||
|
|
||||||
|
#define FS_OFFSET_300_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_300_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x8A270
|
#define FS_OFFSET_300_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x8A270
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_300_EXFAT_LOCK_MUTEX 0x35CC
|
#define FS_OFFSET_300_EXFAT_LOCK_MUTEX 0x35CC
|
||||||
#define FS_OFFSET_300_EXFAT_UNLOCK_MUTEX 0x3638
|
#define FS_OFFSET_300_EXFAT_UNLOCK_MUTEX 0x3638
|
||||||
|
|
||||||
|
#define FS_OFFSET_300_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_300_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x8A270
|
#define FS_OFFSET_300_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x8A270
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_301_LOCK_MUTEX 0x3638
|
#define FS_OFFSET_301_LOCK_MUTEX 0x3638
|
||||||
#define FS_OFFSET_301_UNLOCK_MUTEX 0x36A4
|
#define FS_OFFSET_301_UNLOCK_MUTEX 0x36A4
|
||||||
|
|
||||||
|
#define FS_OFFSET_301_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_301_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x8A32C
|
#define FS_OFFSET_301_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x8A32C
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_301_EXFAT_LOCK_MUTEX 0x3638
|
#define FS_OFFSET_301_EXFAT_LOCK_MUTEX 0x3638
|
||||||
#define FS_OFFSET_301_EXFAT_UNLOCK_MUTEX 0x36A4
|
#define FS_OFFSET_301_EXFAT_UNLOCK_MUTEX 0x36A4
|
||||||
|
|
||||||
|
#define FS_OFFSET_301_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_301_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x8A32C
|
#define FS_OFFSET_301_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x8A32C
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_400_LOCK_MUTEX 0x39A0
|
#define FS_OFFSET_400_LOCK_MUTEX 0x39A0
|
||||||
#define FS_OFFSET_400_UNLOCK_MUTEX 0x3A0C
|
#define FS_OFFSET_400_UNLOCK_MUTEX 0x3A0C
|
||||||
|
|
||||||
|
#define FS_OFFSET_400_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_400_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x9DB48
|
#define FS_OFFSET_400_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x9DB48
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_400_EXFAT_LOCK_MUTEX 0x39A0
|
#define FS_OFFSET_400_EXFAT_LOCK_MUTEX 0x39A0
|
||||||
#define FS_OFFSET_400_EXFAT_UNLOCK_MUTEX 0x3A0C
|
#define FS_OFFSET_400_EXFAT_UNLOCK_MUTEX 0x3A0C
|
||||||
|
|
||||||
|
#define FS_OFFSET_400_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_400_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x9DB48
|
#define FS_OFFSET_400_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x9DB48
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,7 +34,8 @@
|
|||||||
#define FS_OFFSET_410_LOCK_MUTEX 0x39A0
|
#define FS_OFFSET_410_LOCK_MUTEX 0x39A0
|
||||||
#define FS_OFFSET_410_UNLOCK_MUTEX 0x3A0C
|
#define FS_OFFSET_410_UNLOCK_MUTEX 0x3A0C
|
||||||
|
|
||||||
#define FS_OFFSET_410_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x9DBAC
|
#define FS_OFFSET_410_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
|
#define FS_OFFSET_410_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x9DBAC
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_410_SD_MUTEX 0xE80268
|
#define FS_OFFSET_410_SD_MUTEX 0xE80268
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_410_EXFAT_LOCK_MUTEX 0x39A0
|
#define FS_OFFSET_410_EXFAT_LOCK_MUTEX 0x39A0
|
||||||
#define FS_OFFSET_410_EXFAT_UNLOCK_MUTEX 0x3A0C
|
#define FS_OFFSET_410_EXFAT_UNLOCK_MUTEX 0x3A0C
|
||||||
|
|
||||||
|
#define FS_OFFSET_410_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_410_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x9DBAC
|
#define FS_OFFSET_410_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x9DBAC
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_500_LOCK_MUTEX 0x4080
|
#define FS_OFFSET_500_LOCK_MUTEX 0x4080
|
||||||
#define FS_OFFSET_500_UNLOCK_MUTEX 0x40D0
|
#define FS_OFFSET_500_UNLOCK_MUTEX 0x40D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_500_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_500_SDMMC_WRAPPER_CONTROLLER_CLOSE 0xC9380
|
#define FS_OFFSET_500_SDMMC_WRAPPER_CONTROLLER_CLOSE 0xC9380
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_500_EXFAT_LOCK_MUTEX 0x4080
|
#define FS_OFFSET_500_EXFAT_LOCK_MUTEX 0x4080
|
||||||
#define FS_OFFSET_500_EXFAT_UNLOCK_MUTEX 0x40D0
|
#define FS_OFFSET_500_EXFAT_UNLOCK_MUTEX 0x40D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_500_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_500_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0xC9380
|
#define FS_OFFSET_500_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0xC9380
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_510_LOCK_MUTEX 0x4080
|
#define FS_OFFSET_510_LOCK_MUTEX 0x4080
|
||||||
#define FS_OFFSET_510_UNLOCK_MUTEX 0x40D0
|
#define FS_OFFSET_510_UNLOCK_MUTEX 0x40D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_510_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_510_SDMMC_WRAPPER_CONTROLLER_CLOSE 0xC9750
|
#define FS_OFFSET_510_SDMMC_WRAPPER_CONTROLLER_CLOSE 0xC9750
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_510_EXFAT_LOCK_MUTEX 0x4080
|
#define FS_OFFSET_510_EXFAT_LOCK_MUTEX 0x4080
|
||||||
#define FS_OFFSET_510_EXFAT_UNLOCK_MUTEX 0x40D0
|
#define FS_OFFSET_510_EXFAT_UNLOCK_MUTEX 0x40D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_510_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_510_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0xC9750
|
#define FS_OFFSET_510_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0xC9750
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_600_LOCK_MUTEX 0x1412C0
|
#define FS_OFFSET_600_LOCK_MUTEX 0x1412C0
|
||||||
#define FS_OFFSET_600_UNLOCK_MUTEX 0x141310
|
#define FS_OFFSET_600_UNLOCK_MUTEX 0x141310
|
||||||
|
|
||||||
|
#define FS_OFFSET_600_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_600_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x148500
|
#define FS_OFFSET_600_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x148500
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_600_EXFAT_LOCK_MUTEX 0x14C9C0
|
#define FS_OFFSET_600_EXFAT_LOCK_MUTEX 0x14C9C0
|
||||||
#define FS_OFFSET_600_EXFAT_UNLOCK_MUTEX 0x14CA10
|
#define FS_OFFSET_600_EXFAT_UNLOCK_MUTEX 0x14CA10
|
||||||
|
|
||||||
|
#define FS_OFFSET_600_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_600_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x153C00
|
#define FS_OFFSET_600_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x153C00
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_700_LOCK_MUTEX 0x148A90
|
#define FS_OFFSET_700_LOCK_MUTEX 0x148A90
|
||||||
#define FS_OFFSET_700_UNLOCK_MUTEX 0x148AE0
|
#define FS_OFFSET_700_UNLOCK_MUTEX 0x148AE0
|
||||||
|
|
||||||
|
#define FS_OFFSET_700_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_700_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x14FD50
|
#define FS_OFFSET_700_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x14FD50
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_700_EXFAT_LOCK_MUTEX 0x154040
|
#define FS_OFFSET_700_EXFAT_LOCK_MUTEX 0x154040
|
||||||
#define FS_OFFSET_700_EXFAT_UNLOCK_MUTEX 0x154090
|
#define FS_OFFSET_700_EXFAT_UNLOCK_MUTEX 0x154090
|
||||||
|
|
||||||
|
#define FS_OFFSET_700_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_700_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x15B300
|
#define FS_OFFSET_700_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x15B300
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_800_LOCK_MUTEX 0x14B6D0
|
#define FS_OFFSET_800_LOCK_MUTEX 0x14B6D0
|
||||||
#define FS_OFFSET_800_UNLOCK_MUTEX 0x14B720
|
#define FS_OFFSET_800_UNLOCK_MUTEX 0x14B720
|
||||||
|
|
||||||
|
#define FS_OFFSET_800_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_800_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1529E0
|
#define FS_OFFSET_800_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1529E0
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_800_EXFAT_LOCK_MUTEX 0x156C80
|
#define FS_OFFSET_800_EXFAT_LOCK_MUTEX 0x156C80
|
||||||
#define FS_OFFSET_800_EXFAT_UNLOCK_MUTEX 0x156CD0
|
#define FS_OFFSET_800_EXFAT_UNLOCK_MUTEX 0x156CD0
|
||||||
|
|
||||||
|
#define FS_OFFSET_800_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_800_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x15DF90
|
#define FS_OFFSET_800_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x15DF90
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_810_LOCK_MUTEX 0x14B6D0
|
#define FS_OFFSET_810_LOCK_MUTEX 0x14B6D0
|
||||||
#define FS_OFFSET_810_UNLOCK_MUTEX 0x14B720
|
#define FS_OFFSET_810_UNLOCK_MUTEX 0x14B720
|
||||||
|
|
||||||
|
#define FS_OFFSET_810_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_810_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1529E0
|
#define FS_OFFSET_810_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1529E0
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_810_EXFAT_LOCK_MUTEX 0x156C80
|
#define FS_OFFSET_810_EXFAT_LOCK_MUTEX 0x156C80
|
||||||
#define FS_OFFSET_810_EXFAT_UNLOCK_MUTEX 0x156CD0
|
#define FS_OFFSET_810_EXFAT_UNLOCK_MUTEX 0x156CD0
|
||||||
|
|
||||||
|
#define FS_OFFSET_810_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_810_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x15DF90
|
#define FS_OFFSET_810_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x15DF90
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_900_LOCK_MUTEX 0x25280
|
#define FS_OFFSET_900_LOCK_MUTEX 0x25280
|
||||||
#define FS_OFFSET_900_UNLOCK_MUTEX 0x252D0
|
#define FS_OFFSET_900_UNLOCK_MUTEX 0x252D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_900_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_900_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x137740
|
#define FS_OFFSET_900_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x137740
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_900_EXFAT_LOCK_MUTEX 0x25280
|
#define FS_OFFSET_900_EXFAT_LOCK_MUTEX 0x25280
|
||||||
#define FS_OFFSET_900_EXFAT_UNLOCK_MUTEX 0x252D0
|
#define FS_OFFSET_900_EXFAT_UNLOCK_MUTEX 0x252D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_900_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_900_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x137740
|
#define FS_OFFSET_900_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x137740
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_910_LOCK_MUTEX 0x25280
|
#define FS_OFFSET_910_LOCK_MUTEX 0x25280
|
||||||
#define FS_OFFSET_910_UNLOCK_MUTEX 0x252D0
|
#define FS_OFFSET_910_UNLOCK_MUTEX 0x252D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_910_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_910_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x137750
|
#define FS_OFFSET_910_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x137750
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#define FS_OFFSET_910_EXFAT_LOCK_MUTEX 0x25280
|
#define FS_OFFSET_910_EXFAT_LOCK_MUTEX 0x25280
|
||||||
#define FS_OFFSET_910_EXFAT_UNLOCK_MUTEX 0x252D0
|
#define FS_OFFSET_910_EXFAT_UNLOCK_MUTEX 0x252D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_910_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0
|
||||||
#define FS_OFFSET_910_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x137750
|
#define FS_OFFSET_910_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x137750
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
|
|||||||
@@ -271,7 +271,7 @@ int sdmmc_nand_get_active_partition_index()
|
|||||||
|
|
||||||
static uint64_t emummc_read_write_inner(void *buf, unsigned int sector, unsigned int num_sectors, bool is_write)
|
static uint64_t emummc_read_write_inner(void *buf, unsigned int sector, unsigned int num_sectors, bool is_write)
|
||||||
{
|
{
|
||||||
if ((emuMMC_ctx.EMMC_Type == emuMMC_SD))
|
if ((emuMMC_ctx.EMMC_Type == emuMMC_SD_Raw))
|
||||||
{
|
{
|
||||||
// raw partition sector offset: emuMMC_ctx.EMMC_StoragePartitionOffset.
|
// raw partition sector offset: emuMMC_ctx.EMMC_StoragePartitionOffset.
|
||||||
sector += emuMMC_ctx.EMMC_StoragePartitionOffset;
|
sector += emuMMC_ctx.EMMC_StoragePartitionOffset;
|
||||||
@@ -318,6 +318,31 @@ static uint64_t emummc_read_write_inner(void *buf, unsigned int sector, unsigned
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Controller open wrapper
|
||||||
|
uint64_t sdmmc_wrapper_controller_open(int mmc_id)
|
||||||
|
{
|
||||||
|
uint64_t result;
|
||||||
|
sdmmc_accessor_t *_this;
|
||||||
|
_this = sdmmc_accessor_get(mmc_id);
|
||||||
|
|
||||||
|
if (_this != NULL)
|
||||||
|
{
|
||||||
|
// Lock eMMC xfer while SD card is being initialized by FS.
|
||||||
|
if (_this == sdmmc_accessor_get(FS_SDMMC_SD))
|
||||||
|
mutex_lock_handler(FS_SDMMC_EMMC); // Recursive Mutex, handler will lock SD as well if custom_driver
|
||||||
|
|
||||||
|
result = _this->vtab->sdmmc_accessor_controller_open(_this);
|
||||||
|
|
||||||
|
// Unlock eMMC.
|
||||||
|
if (_this == sdmmc_accessor_get(FS_SDMMC_SD))
|
||||||
|
mutex_unlock_handler(FS_SDMMC_EMMC);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
fatal_abort(Fatal_OpenAccessor);
|
||||||
|
}
|
||||||
|
|
||||||
// Controller close wrapper
|
// Controller close wrapper
|
||||||
uint64_t sdmmc_wrapper_controller_close(int mmc_id)
|
uint64_t sdmmc_wrapper_controller_close(int mmc_id)
|
||||||
{
|
{
|
||||||
@@ -389,7 +414,7 @@ uint64_t sdmmc_wrapper_read(void *buf, uint64_t bufSize, int mmc_id, unsigned in
|
|||||||
if (first_sd_read)
|
if (first_sd_read)
|
||||||
{
|
{
|
||||||
first_sd_read = false;
|
first_sd_read = false;
|
||||||
if (emuMMC_ctx.EMMC_Type == emuMMC_SD)
|
if (emuMMC_ctx.EMMC_Type == emuMMC_SD_Raw)
|
||||||
{
|
{
|
||||||
// Because some SD cards have issues with emuMMC's driver
|
// Because some SD cards have issues with emuMMC's driver
|
||||||
// we currently swap to FS's driver after first SD read
|
// we currently swap to FS's driver after first SD read
|
||||||
@@ -400,7 +425,7 @@ uint64_t sdmmc_wrapper_read(void *buf, uint64_t bufSize, int mmc_id, unsigned in
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call hekates driver.
|
// Call hekate's driver.
|
||||||
if (sdmmc_storage_read(&sd_storage, sector, num_sectors, buf))
|
if (sdmmc_storage_read(&sd_storage, sector, num_sectors, buf))
|
||||||
{
|
{
|
||||||
mutex_unlock_handler(mmc_id);
|
mutex_unlock_handler(mmc_id);
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ void mutex_lock_handler(int mmc_id);
|
|||||||
void mutex_unlock_handler(int mmc_id);
|
void mutex_unlock_handler(int mmc_id);
|
||||||
|
|
||||||
// Hooks
|
// Hooks
|
||||||
|
uint64_t sdmmc_wrapper_controller_open(int mmc_id);
|
||||||
uint64_t sdmmc_wrapper_controller_close(int mmc_id);
|
uint64_t sdmmc_wrapper_controller_close(int mmc_id);
|
||||||
uint64_t sdmmc_wrapper_read(void *buf, uint64_t bufSize, int mmc_id, unsigned int sector, unsigned int num_sectors);
|
uint64_t sdmmc_wrapper_read(void *buf, uint64_t bufSize, int mmc_id, unsigned int sector, unsigned int num_sectors);
|
||||||
uint64_t sdmmc_wrapper_write(int mmc_id, unsigned int sector, unsigned int num_sectors, void *buf, uint64_t bufSize);
|
uint64_t sdmmc_wrapper_write(int mmc_id, unsigned int sector, unsigned int num_sectors, void *buf, uint64_t bufSize);
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ enum emuMMC_Type
|
|||||||
emuMMC_EMMC = 0,
|
emuMMC_EMMC = 0,
|
||||||
|
|
||||||
// SD Device raw
|
// SD Device raw
|
||||||
emuMMC_SD,
|
emuMMC_SD_Raw,
|
||||||
// SD Device File
|
// SD Device File
|
||||||
emuMMC_SD_File,
|
emuMMC_SD_File,
|
||||||
|
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ volatile __attribute__((aligned(0x1000))) emuMMC_ctx_t emuMMC_ctx = {
|
|||||||
.fs_ver = FS_VER_MAX,
|
.fs_ver = FS_VER_MAX,
|
||||||
|
|
||||||
// SD Default Metadata
|
// SD Default Metadata
|
||||||
.SD_Type = emuMMC_SD,
|
.SD_Type = emuMMC_SD_Raw,
|
||||||
.SD_StoragePartitionOffset = 0,
|
.SD_StoragePartitionOffset = 0,
|
||||||
|
|
||||||
// EMMC Default Metadata
|
// EMMC Default Metadata
|
||||||
@@ -285,6 +285,9 @@ void setup_hooks(void)
|
|||||||
INJECT_HOOK(fs_offsets->sdmmc_wrapper_read, sdmmc_wrapper_read);
|
INJECT_HOOK(fs_offsets->sdmmc_wrapper_read, sdmmc_wrapper_read);
|
||||||
// sdmmc_wrapper_write hook
|
// sdmmc_wrapper_write hook
|
||||||
INJECT_HOOK(fs_offsets->sdmmc_wrapper_write, sdmmc_wrapper_write);
|
INJECT_HOOK(fs_offsets->sdmmc_wrapper_write, sdmmc_wrapper_write);
|
||||||
|
// sdmmc_wrapper_controller_open hook
|
||||||
|
if (fs_offsets->sdmmc_accessor_controller_open)
|
||||||
|
INJECT_HOOK(fs_offsets->sdmmc_accessor_controller_open, sdmmc_wrapper_controller_open);
|
||||||
// sdmmc_wrapper_controller_close hook
|
// sdmmc_wrapper_controller_close hook
|
||||||
INJECT_HOOK(fs_offsets->sdmmc_accessor_controller_close, sdmmc_wrapper_controller_close);
|
INJECT_HOOK(fs_offsets->sdmmc_accessor_controller_close, sdmmc_wrapper_controller_close);
|
||||||
|
|
||||||
@@ -346,7 +349,7 @@ static void load_emummc_ctx(void)
|
|||||||
emuMMC_ctx.id = config.base_cfg.id;
|
emuMMC_ctx.id = config.base_cfg.id;
|
||||||
emuMMC_ctx.EMMC_Type = (enum emuMMC_Type)config.base_cfg.type;
|
emuMMC_ctx.EMMC_Type = (enum emuMMC_Type)config.base_cfg.type;
|
||||||
emuMMC_ctx.fs_ver = (enum FS_VER)config.base_cfg.fs_version;
|
emuMMC_ctx.fs_ver = (enum FS_VER)config.base_cfg.fs_version;
|
||||||
if (emuMMC_ctx.EMMC_Type == emuMMC_SD)
|
if (emuMMC_ctx.EMMC_Type == emuMMC_SD_Raw)
|
||||||
{
|
{
|
||||||
emuMMC_ctx.EMMC_StoragePartitionOffset = config.partition_cfg.start_sector;
|
emuMMC_ctx.EMMC_StoragePartitionOffset = config.partition_cfg.start_sector;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,6 +72,9 @@ namespace ams::secmon::boot {
|
|||||||
/* care of it here. Perhaps we should read the number of anti-downgrade fuses burnt, and translate that */
|
/* care of it here. Perhaps we should read the number of anti-downgrade fuses burnt, and translate that */
|
||||||
/* to the warmboot key? To be decided during the process of implementing ams-on-mariko support. */
|
/* to the warmboot key? To be decided during the process of implementing ams-on-mariko support. */
|
||||||
reg::Write(pmc + APBDEV_PMC_SECURE_SCRATCH32, 0x129);
|
reg::Write(pmc + APBDEV_PMC_SECURE_SCRATCH32, 0x129);
|
||||||
|
|
||||||
|
/* TODO: Fix to ensure correct scratch contents on mariko, as otherwise wb is broken. */
|
||||||
|
AMS_ABORT_UNLESS(fuse::GetSocType() != fuse::SocType_Mariko);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function derives the master kek and device keys using the tsec root key. */
|
/* This function derives the master kek and device keys using the tsec root key. */
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace ams::secmon::smc {
|
|||||||
[fuse::DramId_IcosaSamsung4GB] = pkg1::MemorySize_4GB,
|
[fuse::DramId_IcosaSamsung4GB] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_IcosaHynix4GB] = pkg1::MemorySize_4GB,
|
[fuse::DramId_IcosaHynix4GB] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_IcosaMicron4GB] = pkg1::MemorySize_4GB,
|
[fuse::DramId_IcosaMicron4GB] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_CopperSamsung4GB] = pkg1::MemorySize_4GB,
|
[fuse::DramId_FiveHynix1y4GB] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_IcosaSamsung6GB] = pkg1::MemorySize_6GB,
|
[fuse::DramId_IcosaSamsung6GB] = pkg1::MemorySize_6GB,
|
||||||
[fuse::DramId_CopperHynix4GB] = pkg1::MemorySize_4GB,
|
[fuse::DramId_CopperHynix4GB] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_CopperMicron4GB] = pkg1::MemorySize_4GB,
|
[fuse::DramId_CopperMicron4GB] = pkg1::MemorySize_4GB,
|
||||||
@@ -66,9 +66,13 @@ namespace ams::secmon::smc {
|
|||||||
[fuse::DramId_HoagSamsung1y4GBX] = pkg1::MemorySize_4GB,
|
[fuse::DramId_HoagSamsung1y4GBX] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_IowaSamsung1y4GBY] = pkg1::MemorySize_4GB,
|
[fuse::DramId_IowaSamsung1y4GBY] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_IowaSamsung1y8GBY] = pkg1::MemorySize_8GB,
|
[fuse::DramId_IowaSamsung1y8GBY] = pkg1::MemorySize_8GB,
|
||||||
[fuse::DramId_IowaSamsung1y4GBA] = pkg1::MemorySize_4GB,
|
[fuse::DramId_FiveSamsung1y4GB] = pkg1::MemorySize_4GB,
|
||||||
[fuse::DramId_FiveSamsung1y8GBX] = pkg1::MemorySize_8GB,
|
[fuse::DramId_HoagSamsung1y8GBX] = pkg1::MemorySize_8GB,
|
||||||
[fuse::DramId_FiveSamsung1y4GBX] = pkg1::MemorySize_4GB,
|
[fuse::DramId_FiveSamsung1y4GBX] = pkg1::MemorySize_4GB,
|
||||||
|
[fuse::DramId_IowaMicron1y4GB] = pkg1::MemorySize_4GB,
|
||||||
|
[fuse::DramId_HoagMicron1y4GB] = pkg1::MemorySize_4GB,
|
||||||
|
[fuse::DramId_FiveMicron1y4GB] = pkg1::MemorySize_4GB,
|
||||||
|
[fuse::DramId_FiveSamsung1y8GBX] = pkg1::MemorySize_8GB,
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr const pkg1::MemoryMode MemoryModes[] = {
|
constexpr const pkg1::MemoryMode MemoryModes[] = {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
[subrepo]
|
[subrepo]
|
||||||
remote = https://github.com/Atmosphere-NX/Atmosphere-libs
|
remote = https://github.com/Atmosphere-NX/Atmosphere-libs
|
||||||
branch = master
|
branch = master
|
||||||
commit = 10e9e0e8f926b11c2c7de16ffe15bea7d7ec2cdf
|
commit = 2c3ccef17e9b267a5d9d232f1aba689f2c591b95
|
||||||
parent = 2ee2a4f1ac04bc7f15de8be8d57ad04d7e73f735
|
parent = d2f48d5e36cb2ba4e8cc014238457bd75df81797
|
||||||
method = merge
|
method = merge
|
||||||
cmdver = 0.4.1
|
cmdver = 0.4.1
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ namespace ams::fuse {
|
|||||||
DramId_IcosaSamsung4GB = 0,
|
DramId_IcosaSamsung4GB = 0,
|
||||||
DramId_IcosaHynix4GB = 1,
|
DramId_IcosaHynix4GB = 1,
|
||||||
DramId_IcosaMicron4GB = 2,
|
DramId_IcosaMicron4GB = 2,
|
||||||
DramId_CopperSamsung4GB = 3,
|
DramId_FiveHynix1y4GB = 3,
|
||||||
DramId_IcosaSamsung6GB = 4,
|
DramId_IcosaSamsung6GB = 4,
|
||||||
DramId_CopperHynix4GB = 5,
|
DramId_CopperHynix4GB = 5,
|
||||||
DramId_CopperMicron4GB = 6,
|
DramId_CopperMicron4GB = 6,
|
||||||
@@ -70,9 +70,13 @@ namespace ams::fuse {
|
|||||||
DramId_HoagSamsung1y4GBX = 19,
|
DramId_HoagSamsung1y4GBX = 19,
|
||||||
DramId_IowaSamsung1y4GBY = 20,
|
DramId_IowaSamsung1y4GBY = 20,
|
||||||
DramId_IowaSamsung1y8GBY = 21,
|
DramId_IowaSamsung1y8GBY = 21,
|
||||||
DramId_IowaSamsung1y4GBA = 22,
|
DramId_FiveSamsung1y4GB = 22,
|
||||||
DramId_FiveSamsung1y8GBX = 23,
|
DramId_HoagSamsung1y8GBX = 23,
|
||||||
DramId_FiveSamsung1y4GBX = 24,
|
DramId_FiveSamsung1y4GBX = 24,
|
||||||
|
DramId_IowaMicron1y4GB = 25,
|
||||||
|
DramId_HoagMicron1y4GB = 26,
|
||||||
|
DramId_FiveMicron1y4GB = 27,
|
||||||
|
DramId_FiveSamsung1y8GBX = 28,
|
||||||
|
|
||||||
DramId_Count,
|
DramId_Count,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -558,7 +558,7 @@ namespace ams::kern::board::nintendo::nx {
|
|||||||
/* NOTE: Atmosphere extension; if we received an exception context from Panic(), */
|
/* NOTE: Atmosphere extension; if we received an exception context from Panic(), */
|
||||||
/* generate a fatal error report using it. */
|
/* generate a fatal error report using it. */
|
||||||
const KExceptionContext *e_ctx = static_cast<const KExceptionContext *>(arg);
|
const KExceptionContext *e_ctx = static_cast<const KExceptionContext *>(arg);
|
||||||
auto *f_ctx = GetPointer<::ams::impl::FatalErrorContext>(iram_address + RebootPayloadSize);
|
auto *f_ctx = GetPointer<::ams::impl::FatalErrorContext>(iram_address + 0x2E000);
|
||||||
|
|
||||||
/* Clear the fatal context. */
|
/* Clear the fatal context. */
|
||||||
std::memset(f_ctx, 0xCC, sizeof(*f_ctx));
|
std::memset(f_ctx, 0xCC, sizeof(*f_ctx));
|
||||||
|
|||||||
@@ -908,7 +908,7 @@ namespace ams::kern {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Check if we're done. */
|
/* Check if we're done. */
|
||||||
if (dst_address + size - 1 > info.GetLastAddress()) {
|
if (dst_address + size - 1 <= info.GetLastAddress()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -164,10 +164,10 @@
|
|||||||
HANDLER(UsbStateInfo, 123) \
|
HANDLER(UsbStateInfo, 123) \
|
||||||
HANDLER(NvHostErrInfo, 124) \
|
HANDLER(NvHostErrInfo, 124) \
|
||||||
HANDLER(RunningUlaInfo, 125) \
|
HANDLER(RunningUlaInfo, 125) \
|
||||||
HANDLER(Category_Unknown126, 126) \
|
HANDLER(InternalPanelInfo, 126) \
|
||||||
HANDLER(Category_Unknown127, 127) \
|
HANDLER(ResourceLimitLimitInfo, 127) \
|
||||||
HANDLER(Category_Unknown128, 128) \
|
HANDLER(ResourceLimitPeakInfo, 128) \
|
||||||
HANDLER(Category_Unknown129, 129) \
|
HANDLER(TouchScreenInfo, 129) \
|
||||||
|
|
||||||
#define AMS_ERPT_FOREACH_FIELD(HANDLER) \
|
#define AMS_ERPT_FOREACH_FIELD(HANDLER) \
|
||||||
HANDLER(TestU64, 0, Test, FieldType_NumericU64, FieldFlag_None ) \
|
HANDLER(TestU64, 0, Test, FieldType_NumericU64, FieldFlag_None ) \
|
||||||
@@ -782,22 +782,22 @@
|
|||||||
HANDLER(NANDTotalSizeOfSystem, 609, NANDFreeSpaceInfo, FieldType_NumericU64, FieldFlag_None ) \
|
HANDLER(NANDTotalSizeOfSystem, 609, NANDFreeSpaceInfo, FieldType_NumericU64, FieldFlag_None ) \
|
||||||
HANDLER(NANDFreeSpaceOfSystem, 610, NANDFreeSpaceInfo, FieldType_NumericU64, FieldFlag_None ) \
|
HANDLER(NANDFreeSpaceOfSystem, 610, NANDFreeSpaceInfo, FieldType_NumericU64, FieldFlag_None ) \
|
||||||
HANDLER(AccessPointSSIDAsHex, 611, AccessPointInfo, FieldType_String, FieldFlag_None ) \
|
HANDLER(AccessPointSSIDAsHex, 611, AccessPointInfo, FieldType_String, FieldFlag_None ) \
|
||||||
HANDLER(PanelVendorId, 612, Category_Unknown126, FieldType_NumericU8, FieldFlag_None ) \
|
HANDLER(PanelVendorId, 612, InternalPanelInfo, FieldType_NumericU8, FieldFlag_None ) \
|
||||||
HANDLER(PanelRevisionId, 613, Category_Unknown126, FieldType_NumericU8, FieldFlag_None ) \
|
HANDLER(PanelRevisionId, 613, InternalPanelInfo, FieldType_NumericU8, FieldFlag_None ) \
|
||||||
HANDLER(PanelModelId, 614, Category_Unknown126, FieldType_NumericU8, FieldFlag_None ) \
|
HANDLER(PanelModelId, 614, InternalPanelInfo, FieldType_NumericU8, FieldFlag_None ) \
|
||||||
HANDLER(ErrorContext, 615, ErrorInfoAuto, FieldType_U8Array, FieldFlag_None ) \
|
HANDLER(ErrorContext, 615, ErrorInfoAuto, FieldType_U8Array, FieldFlag_None ) \
|
||||||
HANDLER(ErrorContextSize, 616, ErrorInfoAuto, FieldType_NumericU64, FieldFlag_None ) \
|
HANDLER(ErrorContextSize, 616, ErrorInfoAuto, FieldType_NumericU64, FieldFlag_None ) \
|
||||||
HANDLER(ErrorContextTotalSize, 617, ErrorInfoAuto, FieldType_NumericU64, FieldFlag_None ) \
|
HANDLER(ErrorContextTotalSize, 617, ErrorInfoAuto, FieldType_NumericU64, FieldFlag_None ) \
|
||||||
HANDLER(SystemPhysicalMemoryLimit, 618, Category_Unknown127, FieldType_NumericI64, FieldFlag_None ) \
|
HANDLER(SystemPhysicalMemoryLimit, 618, ResourceLimitLimitInfo, FieldType_NumericI64, FieldFlag_None ) \
|
||||||
HANDLER(SystemThreadCountLimit, 619, Category_Unknown127, FieldType_NumericI64, FieldFlag_None ) \
|
HANDLER(SystemThreadCountLimit, 619, ResourceLimitLimitInfo, FieldType_NumericI64, FieldFlag_None ) \
|
||||||
HANDLER(SystemEventCountLimit, 620, Category_Unknown127, FieldType_NumericI64, FieldFlag_None ) \
|
HANDLER(SystemEventCountLimit, 620, ResourceLimitLimitInfo, FieldType_NumericI64, FieldFlag_None ) \
|
||||||
HANDLER(SystemTransferMemoryCountLimit, 621, Category_Unknown127, FieldType_NumericI64, FieldFlag_None ) \
|
HANDLER(SystemTransferMemoryCountLimit, 621, ResourceLimitLimitInfo, FieldType_NumericI64, FieldFlag_None ) \
|
||||||
HANDLER(SystemSessionCountLimit, 622, Category_Unknown127, FieldType_NumericI64, FieldFlag_None ) \
|
HANDLER(SystemSessionCountLimit, 622, ResourceLimitLimitInfo, FieldType_NumericI64, FieldFlag_None ) \
|
||||||
HANDLER(SystemPhysicalMemoryPeak, 623, Category_Unknown128, FieldType_NumericI64, FieldFlag_None ) \
|
HANDLER(SystemPhysicalMemoryPeak, 623, ResourceLimitPeakInfo, FieldType_NumericI64, FieldFlag_None ) \
|
||||||
HANDLER(SystemThreadCountPeak, 624, Category_Unknown128, FieldType_NumericI64, FieldFlag_None ) \
|
HANDLER(SystemThreadCountPeak, 624, ResourceLimitPeakInfo, FieldType_NumericI64, FieldFlag_None ) \
|
||||||
HANDLER(SystemEventCountPeak, 625, Category_Unknown128, FieldType_NumericI64, FieldFlag_None ) \
|
HANDLER(SystemEventCountPeak, 625, ResourceLimitPeakInfo, FieldType_NumericI64, FieldFlag_None ) \
|
||||||
HANDLER(SystemTransferMemoryCountPeak, 626, Category_Unknown128, FieldType_NumericI64, FieldFlag_None ) \
|
HANDLER(SystemTransferMemoryCountPeak, 626, ResourceLimitPeakInfo, FieldType_NumericI64, FieldFlag_None ) \
|
||||||
HANDLER(SystemSessionCountPeak, 627, Category_Unknown128, FieldType_NumericI64, FieldFlag_None ) \
|
HANDLER(SystemSessionCountPeak, 627, ResourceLimitPeakInfo, FieldType_NumericI64, FieldFlag_None ) \
|
||||||
HANDLER(GpuCrashHash, 628, GpuCrashInfo, FieldType_U8Array, FieldFlag_None ) \
|
HANDLER(GpuCrashHash, 628, GpuCrashInfo, FieldType_U8Array, FieldFlag_None ) \
|
||||||
HANDLER(TouchScreenPanelGpioValue, 629, Category_Unknown129, FieldType_NumericU8, FieldFlag_None ) \
|
HANDLER(TouchScreenPanelGpioValue, 629, TouchScreenInfo, FieldType_NumericU8, FieldFlag_None ) \
|
||||||
|
|
||||||
|
|||||||
@@ -25,17 +25,17 @@ namespace ams::erpt::sf {
|
|||||||
#define AMS_ERPT_I_CONTEXT_INTERFACE_INFO(C, H) \
|
#define AMS_ERPT_I_CONTEXT_INTERFACE_INFO(C, H) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, SubmitContext, (const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer)) \
|
AMS_SF_METHOD_INFO(C, H, 0, Result, SubmitContext, (const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer)) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, CreateReportV0, (ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &meta_buffer)) \
|
AMS_SF_METHOD_INFO(C, H, 1, Result, CreateReportV0, (ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &meta_buffer)) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, SetInitialLaunchSettingsCompletionTime, (const time::SteadyClockTimePoint &time_point), hos::Version_3_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 2, Result, SetInitialLaunchSettingsCompletionTime, (const time::SteadyClockTimePoint &time_point), hos::Version_3_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, ClearInitialLaunchSettingsCompletionTime, (), hos::Version_3_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 3, Result, ClearInitialLaunchSettingsCompletionTime, (), hos::Version_3_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, UpdatePowerOnTime, (), hos::Version_3_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 4, Result, UpdatePowerOnTime, (), hos::Version_3_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, UpdateAwakeTime, (), hos::Version_3_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 5, Result, UpdateAwakeTime, (), hos::Version_3_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, SubmitMultipleCategoryContext, (const MultipleCategoryContextEntry &ctx_entry, const ams::sf::InBuffer &str_buffer), hos::Version_5_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 6, Result, SubmitMultipleCategoryContext, (const MultipleCategoryContextEntry &ctx_entry, const ams::sf::InBuffer &str_buffer), hos::Version_5_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, UpdateApplicationLaunchTime, (), hos::Version_6_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 7, Result, UpdateApplicationLaunchTime, (), hos::Version_6_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 8, Result, ClearApplicationLaunchTime, (), hos::Version_6_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 8, Result, ClearApplicationLaunchTime, (), hos::Version_6_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, SubmitAttachment, (ams::sf::Out<AttachmentId> out, const ams::sf::InBuffer &attachment_name, const ams::sf::InBuffer &attachment_data), hos::Version_8_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 9, Result, SubmitAttachment, (ams::sf::Out<AttachmentId> out, const ams::sf::InBuffer &attachment_name, const ams::sf::InBuffer &attachment_data), hos::Version_8_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, CreateReportWithAttachmentsDeprecated, (ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &attachment_ids_buffer), hos::Version_8_0_0, hos::Version_10_2_0) \
|
AMS_SF_METHOD_INFO(C, H, 10, Result, CreateReportWithAttachmentsDeprecated, (ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &attachment_ids_buffer), hos::Version_8_0_0, hos::Version_10_2_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, CreateReportWithAttachments, (ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &attachment_ids_buffer, u32 context), hos::Version_11_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 10, Result, CreateReportWithAttachments, (ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &attachment_ids_buffer, Result result), hos::Version_11_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 11, Result, CreateReport, (ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &meta_buffer, u32 context), hos::Version_11_0_0)
|
AMS_SF_METHOD_INFO(C, H, 11, Result, CreateReport, (ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &meta_buffer, Result result), hos::Version_11_0_0)
|
||||||
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IContext, AMS_ERPT_I_CONTEXT_INTERFACE_INFO)
|
AMS_SF_DEFINE_INTERFACE(IContext, AMS_ERPT_I_CONTEXT_INTERFACE_INFO)
|
||||||
|
|||||||
@@ -42,4 +42,52 @@ namespace ams::err {
|
|||||||
static_assert(sizeof(ErrorContext) == 0x200);
|
static_assert(sizeof(ErrorContext) == 0x200);
|
||||||
static_assert(util::is_pod<ErrorContext>::value);
|
static_assert(util::is_pod<ErrorContext>::value);
|
||||||
|
|
||||||
|
struct ContextDescriptor {
|
||||||
|
int value;
|
||||||
|
|
||||||
|
constexpr ALWAYS_INLINE bool operator==(const ContextDescriptor &rhs) const { return this->value == rhs.value; }
|
||||||
|
constexpr ALWAYS_INLINE bool operator!=(const ContextDescriptor &rhs) const { return this->value != rhs.value; }
|
||||||
|
constexpr ALWAYS_INLINE bool operator< (const ContextDescriptor &rhs) const { return this->value < rhs.value; }
|
||||||
|
constexpr ALWAYS_INLINE bool operator<=(const ContextDescriptor &rhs) const { return this->value <= rhs.value; }
|
||||||
|
constexpr ALWAYS_INLINE bool operator> (const ContextDescriptor &rhs) const { return this->value > rhs.value; }
|
||||||
|
constexpr ALWAYS_INLINE bool operator>=(const ContextDescriptor &rhs) const { return this->value >= rhs.value; }
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr inline const ContextDescriptor InvalidContextDescriptor{ -1 };
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
constexpr inline const ContextDescriptor ContextDescriptorMin{ 0x001 };
|
||||||
|
constexpr inline const ContextDescriptor ContextDescriptorMax{ 0x1FF };
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr Result MakeResultWithContextDescriptor(Result result, ContextDescriptor descriptor) {
|
||||||
|
/* Check pre-conditions. */
|
||||||
|
AMS_ASSERT(R_FAILED(result));
|
||||||
|
AMS_ASSERT(descriptor != InvalidContextDescriptor);
|
||||||
|
AMS_ASSERT(impl::ContextDescriptorMin <= descriptor && descriptor <= impl::ContextDescriptorMax);
|
||||||
|
|
||||||
|
return result::impl::ResultInternalAccessor::MergeReserved(result, descriptor.value | 0x200);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr ContextDescriptor GetContextDescriptorFromResult(Result result) {
|
||||||
|
/* Check pre-conditions. */
|
||||||
|
AMS_ASSERT(R_FAILED(result));
|
||||||
|
|
||||||
|
/* Get reserved bits. */
|
||||||
|
const auto reserved = result::impl::ResultInternalAccessor::GetReserved(result);
|
||||||
|
if ((reserved & 0x200) != 0x200) {
|
||||||
|
return InvalidContextDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the descriptor value. */
|
||||||
|
const ContextDescriptor descriptor{static_cast<decltype(ContextDescriptor{}.value)>(reserved & ~0x200)};
|
||||||
|
if (!(impl::ContextDescriptorMin <= descriptor && descriptor <= impl::ContextDescriptorMax)) {
|
||||||
|
return InvalidContextDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
return descriptor;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -238,6 +238,10 @@
|
|||||||
return ::svcSynchronizePreemptionState();
|
return ::svcSynchronizePreemptionState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ALWAYS_INLINE Result GetResourceLimitPeakValue(int64_t *out_peak_value, ::ams::svc::Handle resource_limit_handle, ::ams::svc::LimitableResource which) {
|
||||||
|
return ::svcGetResourceLimitPeakValue(out_peak_value, resource_limit_handle, static_cast<::LimitableResource>(which));
|
||||||
|
}
|
||||||
|
|
||||||
ALWAYS_INLINE void KernelDebug(::ams::svc::KernelDebugType kern_debug_type, uint64_t arg0, uint64_t arg1, uint64_t arg2) {
|
ALWAYS_INLINE void KernelDebug(::ams::svc::KernelDebugType kern_debug_type, uint64_t arg0, uint64_t arg1, uint64_t arg2) {
|
||||||
return ::svcKernelDebug(kern_debug_type, arg0, arg1, arg2);
|
return ::svcKernelDebug(kern_debug_type, arg0, arg1, arg2);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ namespace ams::erpt::srv {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AttachmentFileName Attachment::FileName() {
|
AttachmentFileName Attachment::FileName() const {
|
||||||
return FileName(this->record->info.attachment_id);
|
return FileName(this->record->info.attachment_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ namespace ams::erpt::srv {
|
|||||||
return this->CloseStream();
|
return this->CloseStream();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result Attachment::GetFlags(AttachmentFlagSet *out) {
|
Result Attachment::GetFlags(AttachmentFlagSet *out) const {
|
||||||
*out = this->record->info.flags;
|
*out = this->record->info.flags;
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
@@ -77,7 +77,7 @@ namespace ams::erpt::srv {
|
|||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result Attachment::GetSize(s64 *out) {
|
Result Attachment::GetSize(s64 *out) const {
|
||||||
return this->GetStreamSize(out);
|
return this->GetStreamSize(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ namespace ams::erpt::srv {
|
|||||||
private:
|
private:
|
||||||
JournalRecord<AttachmentInfo> *record;
|
JournalRecord<AttachmentInfo> *record;
|
||||||
private:
|
private:
|
||||||
AttachmentFileName FileName();
|
AttachmentFileName FileName() const;
|
||||||
public:
|
public:
|
||||||
static AttachmentFileName FileName(AttachmentId attachment_id);
|
static AttachmentFileName FileName(AttachmentId attachment_id);
|
||||||
public:
|
public:
|
||||||
@@ -44,9 +44,9 @@ namespace ams::erpt::srv {
|
|||||||
Result Delete();
|
Result Delete();
|
||||||
void Close();
|
void Close();
|
||||||
|
|
||||||
Result GetFlags(AttachmentFlagSet *out);
|
Result GetFlags(AttachmentFlagSet *out) const;
|
||||||
Result SetFlags(AttachmentFlagSet flags);
|
Result SetFlags(AttachmentFlagSet flags);
|
||||||
Result GetSize(s64 *out);
|
Result GetSize(s64 *out) const;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
Result Write(T val) {
|
Result Write(T val) {
|
||||||
|
|||||||
@@ -71,25 +71,23 @@ namespace ams::erpt::srv {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Result Context::AddContextToCategory(const ContextEntry *entry, const u8 *data, u32 data_size) {
|
Result Context::AddContextToCategory(const ContextEntry *entry, const u8 *data, u32 data_size) {
|
||||||
ContextRecord *record = new ContextRecord();
|
auto record = std::make_unique<ContextRecord>();
|
||||||
R_UNLESS(record != nullptr, erpt::ResultOutOfMemory());
|
R_UNLESS(record != nullptr, erpt::ResultOutOfMemory());
|
||||||
auto guard = SCOPE_GUARD { delete record; };
|
|
||||||
|
|
||||||
R_TRY(record->Initialize(entry, data, data_size));
|
R_TRY(record->Initialize(entry, data, data_size));
|
||||||
|
|
||||||
guard.Cancel();
|
this->AddContextRecordToCategory(std::move(record));
|
||||||
this->AddContextRecordToCategory(record);
|
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result Context::AddContextRecordToCategory(ContextRecord *record) {
|
Result Context::AddContextRecordToCategory(std::unique_ptr<ContextRecord> record) {
|
||||||
if (this->record_count < this->max_record_count) {
|
if (this->record_count < this->max_record_count) {
|
||||||
this->record_list.push_front(*record);
|
this->record_list.push_front(*record.release());
|
||||||
this->record_count++;
|
this->record_count++;
|
||||||
} else {
|
} else {
|
||||||
ContextRecord *back = std::addressof(this->record_list.back());
|
ContextRecord *back = std::addressof(this->record_list.back());
|
||||||
this->record_list.pop_back();
|
this->record_list.pop_back();
|
||||||
this->record_list.push_front(*record);
|
this->record_list.push_front(*record.release());
|
||||||
delete back;
|
delete back;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,21 +95,21 @@ namespace ams::erpt::srv {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Result Context::SubmitContext(const ContextEntry *entry, const u8 *data, u32 data_size) {
|
Result Context::SubmitContext(const ContextEntry *entry, const u8 *data, u32 data_size) {
|
||||||
for (auto it = g_category_list.begin(); it != g_category_list.end(); it++) {
|
auto it = util::range::find_if(g_category_list, [&](const Context &cur) {
|
||||||
if (it->category == entry->category) {
|
return cur.category == entry->category;
|
||||||
return it->AddContextToCategory(entry, data, data_size);
|
});
|
||||||
}
|
R_UNLESS(it != g_category_list.end(), erpt::ResultCategoryNotFound());
|
||||||
}
|
|
||||||
return erpt::ResultCategoryNotFound();
|
return it->AddContextToCategory(entry, data, data_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result Context::SubmitContextRecord(ContextRecord *record) {
|
Result Context::SubmitContextRecord(std::unique_ptr<ContextRecord> record) {
|
||||||
for (auto it = g_category_list.begin(); it != g_category_list.end(); it++) {
|
auto it = util::range::find_if(g_category_list, [&](const Context &cur) {
|
||||||
if (it->category == record->ctx.category) {
|
return cur.category == record->ctx.category;
|
||||||
return it->AddContextRecordToCategory(record);
|
});
|
||||||
}
|
R_UNLESS(it != g_category_list.end(), erpt::ResultCategoryNotFound());
|
||||||
}
|
|
||||||
return erpt::ResultCategoryNotFound();
|
return it->AddContextRecordToCategory(std::move(record));
|
||||||
}
|
}
|
||||||
|
|
||||||
Result Context::WriteContextsToReport(Report *report) {
|
Result Context::WriteContextsToReport(Report *report) {
|
||||||
|
|||||||
@@ -35,10 +35,10 @@ namespace ams::erpt::srv {
|
|||||||
|
|
||||||
Result AddCategoryToReport(Report *report);
|
Result AddCategoryToReport(Report *report);
|
||||||
Result AddContextToCategory(const ContextEntry *entry, const u8 *data, u32 data_size);
|
Result AddContextToCategory(const ContextEntry *entry, const u8 *data, u32 data_size);
|
||||||
Result AddContextRecordToCategory(ContextRecord *record);
|
Result AddContextRecordToCategory(std::unique_ptr<ContextRecord> record);
|
||||||
public:
|
public:
|
||||||
static Result SubmitContext(const ContextEntry *entry, const u8 *data, u32 data_size);
|
static Result SubmitContext(const ContextEntry *entry, const u8 *data, u32 data_size);
|
||||||
static Result SubmitContextRecord(ContextRecord *record);
|
static Result SubmitContextRecord(std::unique_ptr<ContextRecord> record);
|
||||||
static Result WriteContextsToReport(Report *report);
|
static Result WriteContextsToReport(Report *report);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ namespace ams::erpt::srv {
|
|||||||
return Context::SubmitContext(ctx, data, data_size);
|
return Context::SubmitContext(ctx, data, data_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ContextImpl::CreateReport(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &meta_buffer, u32 context) {
|
Result ContextImpl::CreateReport(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &meta_buffer, Result result) {
|
||||||
const ContextEntry *ctx = reinterpret_cast<const ContextEntry *>( ctx_buffer.GetPointer());
|
const ContextEntry *ctx = reinterpret_cast<const ContextEntry *>( ctx_buffer.GetPointer());
|
||||||
const u8 *data = reinterpret_cast<const u8 *>(data_buffer.GetPointer());
|
const u8 *data = reinterpret_cast<const u8 *>(data_buffer.GetPointer());
|
||||||
const ReportMetaData *meta = reinterpret_cast<const ReportMetaData *>(meta_buffer.GetPointer());
|
const ReportMetaData *meta = reinterpret_cast<const ReportMetaData *>(meta_buffer.GetPointer());
|
||||||
@@ -47,9 +47,7 @@ namespace ams::erpt::srv {
|
|||||||
R_UNLESS(ctx_size == sizeof(ContextEntry), erpt::ResultInvalidArgument());
|
R_UNLESS(ctx_size == sizeof(ContextEntry), erpt::ResultInvalidArgument());
|
||||||
R_UNLESS(meta_size == 0 || meta_size == sizeof(ReportMetaData), erpt::ResultInvalidArgument());
|
R_UNLESS(meta_size == 0 || meta_size == sizeof(ReportMetaData), erpt::ResultInvalidArgument());
|
||||||
|
|
||||||
/* TODO: use context */
|
Reporter reporter(report_type, ctx, data, data_size, meta_size != 0 ? meta : nullptr, nullptr, 0, result);
|
||||||
|
|
||||||
Reporter reporter(report_type, ctx, data, data_size, meta_size != 0 ? meta : nullptr, nullptr, 0);
|
|
||||||
R_TRY(reporter.CreateReport());
|
R_TRY(reporter.CreateReport());
|
||||||
|
|
||||||
ManagerImpl::NotifyAll();
|
ManagerImpl::NotifyAll();
|
||||||
@@ -58,7 +56,7 @@ namespace ams::erpt::srv {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Result ContextImpl::CreateReportV0(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &meta_buffer) {
|
Result ContextImpl::CreateReportV0(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &meta_buffer) {
|
||||||
return this->CreateReport(report_type, ctx_buffer, data_buffer, meta_buffer, {});
|
return this->CreateReport(report_type, ctx_buffer, data_buffer, meta_buffer, ResultSuccess());
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ContextImpl::SetInitialLaunchSettingsCompletionTime(const time::SteadyClockTimePoint &time_point) {
|
Result ContextImpl::SetInitialLaunchSettingsCompletionTime(const time::SteadyClockTimePoint &time_point) {
|
||||||
@@ -138,7 +136,7 @@ namespace ams::erpt::srv {
|
|||||||
return JournalForAttachments::SubmitAttachment(out.GetPointer(), name_safe, data, data_size);
|
return JournalForAttachments::SubmitAttachment(out.GetPointer(), name_safe, data, data_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ContextImpl::CreateReportWithAttachments(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &attachment_ids_buffer, u32 context) {
|
Result ContextImpl::CreateReportWithAttachments(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &attachment_ids_buffer, Result result) {
|
||||||
const ContextEntry *ctx = reinterpret_cast<const ContextEntry *>( ctx_buffer.GetPointer());
|
const ContextEntry *ctx = reinterpret_cast<const ContextEntry *>( ctx_buffer.GetPointer());
|
||||||
const u8 *data = reinterpret_cast<const u8 *>(data_buffer.GetPointer());
|
const u8 *data = reinterpret_cast<const u8 *>(data_buffer.GetPointer());
|
||||||
const u32 ctx_size = static_cast<u32>(ctx_buffer.GetSize());
|
const u32 ctx_size = static_cast<u32>(ctx_buffer.GetSize());
|
||||||
@@ -150,9 +148,7 @@ namespace ams::erpt::srv {
|
|||||||
R_UNLESS(ctx_size == sizeof(ContextEntry), erpt::ResultInvalidArgument());
|
R_UNLESS(ctx_size == sizeof(ContextEntry), erpt::ResultInvalidArgument());
|
||||||
R_UNLESS(num_attachments <= AttachmentsPerReportMax, erpt::ResultInvalidArgument());
|
R_UNLESS(num_attachments <= AttachmentsPerReportMax, erpt::ResultInvalidArgument());
|
||||||
|
|
||||||
/* TODO: use context */
|
Reporter reporter(report_type, ctx, data, data_size, nullptr, attachments, num_attachments, result);
|
||||||
|
|
||||||
Reporter reporter(report_type, ctx, data, data_size, nullptr, attachments, num_attachments);
|
|
||||||
R_TRY(reporter.CreateReport());
|
R_TRY(reporter.CreateReport());
|
||||||
|
|
||||||
ManagerImpl::NotifyAll();
|
ManagerImpl::NotifyAll();
|
||||||
@@ -161,7 +157,7 @@ namespace ams::erpt::srv {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Result ContextImpl::CreateReportWithAttachmentsDeprecated(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &attachment_ids_buffer) {
|
Result ContextImpl::CreateReportWithAttachmentsDeprecated(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &attachment_ids_buffer) {
|
||||||
return this->CreateReportWithAttachments(report_type, ctx_buffer, data_buffer, attachment_ids_buffer, {});
|
return this->CreateReportWithAttachments(report_type, ctx_buffer, data_buffer, attachment_ids_buffer, ResultSuccess());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ namespace ams::erpt::srv {
|
|||||||
Result ClearApplicationLaunchTime();
|
Result ClearApplicationLaunchTime();
|
||||||
Result SubmitAttachment(ams::sf::Out<AttachmentId> out, const ams::sf::InBuffer &attachment_name, const ams::sf::InBuffer &attachment_data);
|
Result SubmitAttachment(ams::sf::Out<AttachmentId> out, const ams::sf::InBuffer &attachment_name, const ams::sf::InBuffer &attachment_data);
|
||||||
Result CreateReportWithAttachmentsDeprecated(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &attachment_ids_buffer);
|
Result CreateReportWithAttachmentsDeprecated(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &attachment_ids_buffer);
|
||||||
Result CreateReportWithAttachments(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &attachment_ids_buffer, u32 context);
|
Result CreateReportWithAttachments(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &attachment_ids_buffer, Result result);
|
||||||
Result CreateReport(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &meta_buffer, u32 context);
|
Result CreateReport(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &meta_buffer, Result result);
|
||||||
};
|
};
|
||||||
static_assert(erpt::sf::IsIContext<ContextImpl>);
|
static_assert(erpt::sf::IsIContext<ContextImpl>);
|
||||||
|
|
||||||
|
|||||||
@@ -37,14 +37,14 @@ namespace ams::erpt::srv {
|
|||||||
this->ctx = {};
|
this->ctx = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
ContextRecord::ContextRecord(CategoryId category) {
|
ContextRecord::ContextRecord(CategoryId category, u32 array_buf_size) {
|
||||||
this->ctx = {
|
this->ctx = {
|
||||||
.category = category,
|
.category = category,
|
||||||
.array_buffer = static_cast<u8 *>(Allocate(ArrayBufferSizeDefault)),
|
.array_buffer = static_cast<u8 *>(Allocate(array_buf_size)),
|
||||||
};
|
};
|
||||||
if (this->ctx.array_buffer != nullptr) {
|
if (this->ctx.array_buffer != nullptr) {
|
||||||
this->ctx.array_buffer_size = ArrayBufferSizeDefault;
|
this->ctx.array_buffer_size = array_buf_size;
|
||||||
this->ctx.array_free_count = ArrayBufferSizeDefault;
|
this->ctx.array_free_count = array_buf_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,26 +176,34 @@ namespace ams::erpt::srv {
|
|||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ContextRecord::Add(FieldId field_id, const char *str, u32 str_size) {
|
Result ContextRecord::Add(FieldId field_id, const void *arr, u32 size, FieldType type) {
|
||||||
R_UNLESS(this->ctx.field_count < FieldsPerContext, erpt::ResultOutOfFieldSpace());
|
R_UNLESS(this->ctx.field_count < FieldsPerContext, erpt::ResultOutOfFieldSpace());
|
||||||
R_UNLESS(str_size <= this->ctx.array_free_count, erpt::ResultOutOfArraySpace());
|
R_UNLESS(size <= this->ctx.array_free_count, erpt::ResultOutOfArraySpace());
|
||||||
|
|
||||||
const u32 start_idx = this->ctx.array_buffer_size - this->ctx.array_free_count;
|
const u32 start_idx = this->ctx.array_buffer_size - this->ctx.array_free_count;
|
||||||
this->ctx.array_free_count -= str_size;
|
this->ctx.array_free_count -= size;
|
||||||
|
|
||||||
s_record_count++;
|
s_record_count++;
|
||||||
auto &field = this->ctx.fields[this->ctx.field_count++];
|
auto &field = this->ctx.fields[this->ctx.field_count++];
|
||||||
|
|
||||||
field.id = field_id;
|
field.id = field_id;
|
||||||
field.type = FieldType_String;
|
field.type = type;
|
||||||
|
|
||||||
field.value_array = {
|
field.value_array = {
|
||||||
.start_idx = start_idx,
|
.start_idx = start_idx,
|
||||||
.size = str_size,
|
.size = size,
|
||||||
};
|
};
|
||||||
|
|
||||||
std::memcpy(this->ctx.array_buffer + start_idx, str, str_size);
|
std::memcpy(this->ctx.array_buffer + start_idx, arr, size);
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result ContextRecord::Add(FieldId field_id, const char *str, u32 str_size) {
|
||||||
|
return this->Add(field_id, str, str_size, FieldType_String);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result ContextRecord::Add(FieldId field_id, const u8 *data, u32 size) {
|
||||||
|
return this->Add(field_id, data, size, FieldType_U8Array);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,9 +31,11 @@ namespace ams::erpt::srv {
|
|||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
ContextEntry ctx;
|
ContextEntry ctx;
|
||||||
|
private:
|
||||||
|
Result Add(FieldId field_id, const void *arr, u32 size, FieldType type);
|
||||||
public:
|
public:
|
||||||
ContextRecord();
|
ContextRecord();
|
||||||
explicit ContextRecord(CategoryId category);
|
explicit ContextRecord(CategoryId category, u32 array_buf_size = ArrayBufferSizeDefault);
|
||||||
~ContextRecord();
|
~ContextRecord();
|
||||||
|
|
||||||
Result Initialize(const ContextEntry *ctx_ptr, const u8 *data, u32 data_size);
|
Result Initialize(const ContextEntry *ctx_ptr, const u8 *data, u32 data_size);
|
||||||
@@ -44,6 +46,7 @@ namespace ams::erpt::srv {
|
|||||||
Result Add(FieldId field_id, s32 value_i32);
|
Result Add(FieldId field_id, s32 value_i32);
|
||||||
Result Add(FieldId field_id, s64 value_i64);
|
Result Add(FieldId field_id, s64 value_i64);
|
||||||
Result Add(FieldId field_id, const char *str, u32 str_size);
|
Result Add(FieldId field_id, const char *str, u32 str_size);
|
||||||
|
Result Add(FieldId field_id, const u8 *data, u32 size);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,18 +37,32 @@ namespace ams::erpt::srv {
|
|||||||
static ValueTypeTag GetTag(u32) { return ValueTypeTag::U32; }
|
static ValueTypeTag GetTag(u32) { return ValueTypeTag::U32; }
|
||||||
static ValueTypeTag GetTag(u64) { return ValueTypeTag::U64; }
|
static ValueTypeTag GetTag(u64) { return ValueTypeTag::U64; }
|
||||||
|
|
||||||
|
static Result AddStringValue(Report *report, const char *str, u32 len) {
|
||||||
|
const u32 str_len = str != nullptr ? static_cast<u32>(strnlen(str, len)) : 0;
|
||||||
|
|
||||||
|
if (str_len < ElementSize_32) {
|
||||||
|
R_TRY(report->Write(static_cast<u8>(static_cast<u8>(ValueTypeTag::FixStr) | str_len)));
|
||||||
|
} else if (str_len < ElementSize_256) {
|
||||||
|
R_TRY(report->Write(static_cast<u8>(ValueTypeTag::Str8)));
|
||||||
|
R_TRY(report->Write(static_cast<u8>(str_len)));
|
||||||
|
} else {
|
||||||
|
R_UNLESS(str_len < ElementSize_16384, erpt::ResultFormatterError());
|
||||||
|
R_TRY(report->Write(static_cast<u8>(ValueTypeTag::Str16)));
|
||||||
|
|
||||||
|
u16 be_str_len;
|
||||||
|
util::StoreBigEndian(std::addressof(be_str_len), static_cast<u16>(str_len));
|
||||||
|
R_TRY(report->Write(be_str_len));
|
||||||
|
}
|
||||||
|
|
||||||
|
R_TRY(report->Write(str, str_len));
|
||||||
|
|
||||||
|
return ResultSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
static Result AddId(Report *report, FieldId field_id) {
|
static Result AddId(Report *report, FieldId field_id) {
|
||||||
static_assert(MaxFieldStringSize < ElementSize_256);
|
static_assert(MaxFieldStringSize < ElementSize_256);
|
||||||
|
|
||||||
const u32 field_len = static_cast<u32>(strnlen(FieldString[field_id], MaxFieldStringSize));
|
R_TRY(AddStringValue(report, FieldString[field_id], strnlen(FieldString[field_id], MaxFieldStringSize)));
|
||||||
if (field_len < ElementSize_32) {
|
|
||||||
R_TRY(report->Write(static_cast<u8>(static_cast<u8>(ValueTypeTag::FixStr) | field_len)));
|
|
||||||
} else {
|
|
||||||
R_TRY(report->Write(static_cast<u8>(ValueTypeTag::Str8)));
|
|
||||||
R_TRY(report->Write(static_cast<u8>(field_len)));
|
|
||||||
}
|
|
||||||
|
|
||||||
R_TRY(report->Write(FieldString[field_id], field_len));
|
|
||||||
|
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
@@ -140,23 +154,7 @@ namespace ams::erpt::srv {
|
|||||||
static Result AddField(Report *report, FieldId field_id, char *str, u32 len) {
|
static Result AddField(Report *report, FieldId field_id, char *str, u32 len) {
|
||||||
R_TRY(AddId(report, field_id));
|
R_TRY(AddId(report, field_id));
|
||||||
|
|
||||||
const u32 str_len = str != nullptr ? static_cast<u32>(strnlen(str, len)) : 0;
|
R_TRY(AddStringValue(report, str, len));
|
||||||
|
|
||||||
if (str_len < ElementSize_32) {
|
|
||||||
R_TRY(report->Write(static_cast<u8>(static_cast<u8>(ValueTypeTag::FixStr) | str_len)));
|
|
||||||
} else if (str_len < ElementSize_256) {
|
|
||||||
R_TRY(report->Write(static_cast<u8>(ValueTypeTag::Str8)));
|
|
||||||
R_TRY(report->Write(static_cast<u8>(str_len)));
|
|
||||||
} else {
|
|
||||||
R_UNLESS(str_len < ElementSize_16384, erpt::ResultFormatterError());
|
|
||||||
R_TRY(report->Write(static_cast<u8>(ValueTypeTag::Str16)));
|
|
||||||
|
|
||||||
u16 be_str_len;
|
|
||||||
util::StoreBigEndian(std::addressof(be_str_len), static_cast<u16>(str_len));
|
|
||||||
R_TRY(report->Write(be_str_len));
|
|
||||||
}
|
|
||||||
|
|
||||||
R_TRY(report->Write(str, str_len));
|
|
||||||
|
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,22 +99,22 @@ namespace ams::erpt::srv {
|
|||||||
|
|
||||||
Result SetProductModel(const char *model, u32 model_len) {
|
Result SetProductModel(const char *model, u32 model_len) {
|
||||||
/* NOTE: Nintendo does not check that this allocation succeeds. */
|
/* NOTE: Nintendo does not check that this allocation succeeds. */
|
||||||
auto *record = new ContextRecord(CategoryId_ProductModelInfo);
|
auto record = std::make_unique<ContextRecord>(CategoryId_ProductModelInfo);
|
||||||
R_UNLESS(record != nullptr, erpt::ResultOutOfMemory());
|
R_UNLESS(record != nullptr, erpt::ResultOutOfMemory());
|
||||||
|
|
||||||
R_TRY(record->Add(FieldId_ProductModel, model, model_len));
|
R_TRY(record->Add(FieldId_ProductModel, model, model_len));
|
||||||
R_TRY(Context::SubmitContextRecord(record));
|
R_TRY(Context::SubmitContextRecord(std::move(record)));
|
||||||
|
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result SetRegionSetting(const char *region, u32 region_len) {
|
Result SetRegionSetting(const char *region, u32 region_len) {
|
||||||
/* NOTE: Nintendo does not check that this allocation succeeds. */
|
/* NOTE: Nintendo does not check that this allocation succeeds. */
|
||||||
auto *record = new ContextRecord(CategoryId_RegionSettingInfo);
|
auto record = std::make_unique<ContextRecord>(CategoryId_RegionSettingInfo);
|
||||||
R_UNLESS(record != nullptr, erpt::ResultOutOfMemory());
|
R_UNLESS(record != nullptr, erpt::ResultOutOfMemory());
|
||||||
|
|
||||||
R_TRY(record->Add(FieldId_RegionSetting, region, region_len));
|
R_TRY(record->Add(FieldId_RegionSetting, region, region_len));
|
||||||
R_TRY(Context::SubmitContextRecord(record));
|
R_TRY(Context::SubmitContextRecord(std::move(record)));
|
||||||
|
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ namespace ams::erpt::srv {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ReportFileName Report::FileName() {
|
ReportFileName Report::FileName() const {
|
||||||
return FileName(this->record->info.id, this->redirect_to_sd_card);
|
return FileName(this->record->info.id, this->redirect_to_sd_card);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ namespace ams::erpt::srv {
|
|||||||
return this->CloseStream();
|
return this->CloseStream();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result Report::GetFlags(ReportFlagSet *out) {
|
Result Report::GetFlags(ReportFlagSet *out) const {
|
||||||
*out = this->record->info.flags;
|
*out = this->record->info.flags;
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
@@ -83,7 +83,7 @@ namespace ams::erpt::srv {
|
|||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result Report::GetSize(s64 *out) {
|
Result Report::GetSize(s64 *out) const {
|
||||||
return this->GetStreamSize(out);
|
return this->GetStreamSize(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ namespace ams::erpt::srv {
|
|||||||
JournalRecord<ReportInfo> *record;
|
JournalRecord<ReportInfo> *record;
|
||||||
bool redirect_to_sd_card;
|
bool redirect_to_sd_card;
|
||||||
private:
|
private:
|
||||||
ReportFileName FileName();
|
ReportFileName FileName() const;
|
||||||
public:
|
public:
|
||||||
static ReportFileName FileName(ReportId report_id, bool redirect_to_sd);
|
static ReportFileName FileName(ReportId report_id, bool redirect_to_sd);
|
||||||
public:
|
public:
|
||||||
@@ -45,9 +45,9 @@ namespace ams::erpt::srv {
|
|||||||
Result Delete();
|
Result Delete();
|
||||||
void Close();
|
void Close();
|
||||||
|
|
||||||
Result GetFlags(ReportFlagSet *out);
|
Result GetFlags(ReportFlagSet *out) const;
|
||||||
Result SetFlags(ReportFlagSet flags);
|
Result SetFlags(ReportFlagSet flags);
|
||||||
Result GetSize(s64 *out);
|
Result GetSize(s64 *out) const;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
Result Write(T val) {
|
Result Write(T val) {
|
||||||
|
|||||||
@@ -22,17 +22,158 @@
|
|||||||
|
|
||||||
namespace ams::erpt::srv {
|
namespace ams::erpt::srv {
|
||||||
|
|
||||||
bool Reporter::s_redirect_new_reports = true;
|
constinit bool Reporter::s_redirect_new_reports = true;
|
||||||
char Reporter::s_serial_number[24] = "Unknown";
|
constinit char Reporter::s_serial_number[24] = "Unknown";
|
||||||
char Reporter::s_os_version[24] = "Unknown";
|
constinit char Reporter::s_os_version[24] = "Unknown";
|
||||||
char Reporter::s_private_os_version[96] = "Unknown";
|
constinit char Reporter::s_private_os_version[96] = "Unknown";
|
||||||
std::optional<os::Tick> Reporter::s_application_launch_time;
|
constinit std::optional<os::Tick> Reporter::s_application_launch_time;
|
||||||
std::optional<os::Tick> Reporter::s_awake_time;
|
constinit std::optional<os::Tick> Reporter::s_awake_time;
|
||||||
std::optional<os::Tick> Reporter::s_power_on_time;
|
constinit std::optional<os::Tick> Reporter::s_power_on_time;
|
||||||
std::optional<time::SteadyClockTimePoint> Reporter::s_initial_launch_settings_completion_time;
|
constinit std::optional<time::SteadyClockTimePoint> Reporter::s_initial_launch_settings_completion_time;
|
||||||
|
|
||||||
Reporter::Reporter(ReportType type, const ContextEntry *ctx, const u8 *data, u32 data_size, const ReportMetaData *meta, const AttachmentId *attachments, u32 num_attachments)
|
namespace {
|
||||||
: type(type), ctx(ctx), data(data), data_size(data_size), meta(meta), attachments(attachments), num_attachments(num_attachments), occurrence_tick()
|
|
||||||
|
constinit os::SdkMutex g_limit_mutex;
|
||||||
|
constinit bool g_submitted_limit = false;
|
||||||
|
|
||||||
|
Result PullErrorContext(size_t *out_total_size, size_t *out_size, void *dst, size_t dst_size, const err::ContextDescriptor &descriptor, Result result) {
|
||||||
|
s32 unk0;
|
||||||
|
u32 total_size, size;
|
||||||
|
R_TRY(::ectxrPullContext(std::addressof(unk0), std::addressof(total_size), std::addressof(size), dst, dst_size, descriptor.value, result.GetValue()));
|
||||||
|
|
||||||
|
*out_total_size = total_size;
|
||||||
|
*out_size = size;
|
||||||
|
return ResultSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubmitErrorContext(ContextRecord *record, Result result) {
|
||||||
|
/* Only support submitting context on 11.x. */
|
||||||
|
if (hos::GetVersion() < hos::Version_11_0_0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the context descriptor. */
|
||||||
|
const auto descriptor = err::GetContextDescriptorFromResult(result);
|
||||||
|
if (descriptor == err::InvalidContextDescriptor) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pull the error context. */
|
||||||
|
u8 error_context[0x200];
|
||||||
|
size_t error_context_total_size;
|
||||||
|
size_t error_context_size;
|
||||||
|
if (R_FAILED(PullErrorContext(std::addressof(error_context_total_size), std::addressof(error_context_size), error_context, util::size(error_context), descriptor, result))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the total size. */
|
||||||
|
if (error_context_total_size == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
record->Add(FieldId_ErrorContextTotalSize, error_context_total_size);
|
||||||
|
|
||||||
|
/* Set the context. */
|
||||||
|
if (error_context_size == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
record->Add(FieldId_ErrorContextSize, error_context_size);
|
||||||
|
record->Add(FieldId_ErrorContext, error_context, error_context_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubmitResourceLimitLimitContext() {
|
||||||
|
std::scoped_lock lk(g_limit_mutex);
|
||||||
|
if (g_submitted_limit) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ON_SCOPE_EXIT { g_submitted_limit = true; };
|
||||||
|
|
||||||
|
/* Create and populate the record. */
|
||||||
|
auto record = std::make_unique<ContextRecord>(CategoryId_ResourceLimitLimitInfo);
|
||||||
|
if (record == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 reslimit_handle_value;
|
||||||
|
if (R_FAILED(svc::GetInfo(std::addressof(reslimit_handle_value), svc::InfoType_ResourceLimit, svc::InvalidHandle, 0))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto handle = static_cast<svc::Handle>(reslimit_handle_value);
|
||||||
|
ON_SCOPE_EXIT { R_ABORT_UNLESS(svc::CloseHandle(handle)); };
|
||||||
|
|
||||||
|
#define ADD_RESOURCE(__RESOURCE__) \
|
||||||
|
do { \
|
||||||
|
s64 limit_value; \
|
||||||
|
if (R_FAILED(svc::GetResourceLimitLimitValue(std::addressof(limit_value), handle, svc::LimitableResource_##__RESOURCE__##Max))) { \
|
||||||
|
return; \
|
||||||
|
} \
|
||||||
|
if (R_FAILED(record->Add(FieldId_System##__RESOURCE__##Limit, limit_value))) { \
|
||||||
|
return; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
ADD_RESOURCE(PhysicalMemory);
|
||||||
|
ADD_RESOURCE(ThreadCount);
|
||||||
|
ADD_RESOURCE(EventCount);
|
||||||
|
ADD_RESOURCE(TransferMemoryCount);
|
||||||
|
ADD_RESOURCE(SessionCount);
|
||||||
|
|
||||||
|
#undef ADD_RESOURCE
|
||||||
|
|
||||||
|
Context::SubmitContextRecord(std::move(record));
|
||||||
|
|
||||||
|
g_submitted_limit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubmitResourceLimitPeakContext() {
|
||||||
|
/* Create and populate the record. */
|
||||||
|
auto record = std::make_unique<ContextRecord>(CategoryId_ResourceLimitPeakInfo);
|
||||||
|
if (record == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 reslimit_handle_value;
|
||||||
|
if (R_FAILED(svc::GetInfo(std::addressof(reslimit_handle_value), svc::InfoType_ResourceLimit, svc::InvalidHandle, 0))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto handle = static_cast<svc::Handle>(reslimit_handle_value);
|
||||||
|
ON_SCOPE_EXIT { R_ABORT_UNLESS(svc::CloseHandle(handle)); };
|
||||||
|
|
||||||
|
#define ADD_RESOURCE(__RESOURCE__) \
|
||||||
|
do { \
|
||||||
|
s64 peak_value; \
|
||||||
|
if (R_FAILED(svc::GetResourceLimitPeakValue(std::addressof(peak_value), handle, svc::LimitableResource_##__RESOURCE__##Max))) { \
|
||||||
|
return; \
|
||||||
|
} \
|
||||||
|
if (R_FAILED(record->Add(FieldId_System##__RESOURCE__##Peak, peak_value))) { \
|
||||||
|
return; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
ADD_RESOURCE(PhysicalMemory);
|
||||||
|
ADD_RESOURCE(ThreadCount);
|
||||||
|
ADD_RESOURCE(EventCount);
|
||||||
|
ADD_RESOURCE(TransferMemoryCount);
|
||||||
|
ADD_RESOURCE(SessionCount);
|
||||||
|
|
||||||
|
#undef ADD_RESOURCE
|
||||||
|
|
||||||
|
Context::SubmitContextRecord(std::move(record));
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubmitResourceLimitContexts() {
|
||||||
|
if (hos::GetVersion() >= hos::Version_11_0_0 || svc::IsKernelMesosphere()) {
|
||||||
|
SubmitResourceLimitLimitContext();
|
||||||
|
SubmitResourceLimitPeakContext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Reporter::Reporter(ReportType type, const ContextEntry *ctx, const u8 *data, u32 data_size, const ReportMetaData *meta, const AttachmentId *attachments, u32 num_attachments, Result ctx_r)
|
||||||
|
: type(type), ctx(ctx), data(data), data_size(data_size), meta(meta), attachments(attachments), num_attachments(num_attachments), occurrence_tick(), ctx_result(ctx_r)
|
||||||
{
|
{
|
||||||
/* ... */
|
/* ... */
|
||||||
}
|
}
|
||||||
@@ -53,13 +194,9 @@ namespace ams::erpt::srv {
|
|||||||
R_UNLESS(this->ctx->category == CategoryId_ErrorInfo, erpt::ResultRequiredContextMissing());
|
R_UNLESS(this->ctx->category == CategoryId_ErrorInfo, erpt::ResultRequiredContextMissing());
|
||||||
R_UNLESS(this->ctx->field_count <= FieldsPerContext, erpt::ResultInvalidArgument());
|
R_UNLESS(this->ctx->field_count <= FieldsPerContext, erpt::ResultInvalidArgument());
|
||||||
|
|
||||||
bool found_error_code = false;
|
const bool found_error_code = util::range::any_of(MakeSpan(this->ctx->fields, this->ctx->field_count), [] (const FieldEntry &entry) {
|
||||||
for (u32 i = 0; i < this->ctx->field_count; i++) {
|
return entry.id == FieldId_ErrorCode;
|
||||||
if (this->ctx->fields[i].id == FieldId_ErrorCode) {
|
});
|
||||||
found_error_code = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
R_UNLESS(found_error_code, erpt::ResultRequiredFieldMissing());
|
R_UNLESS(found_error_code, erpt::ResultRequiredFieldMissing());
|
||||||
|
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
@@ -83,6 +220,9 @@ namespace ams::erpt::srv {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Result Reporter::SubmitReportDefaults() {
|
Result Reporter::SubmitReportDefaults() {
|
||||||
|
auto record = std::make_unique<ContextRecord>(CategoryId_ErrorInfoDefaults);
|
||||||
|
R_UNLESS(record != nullptr, erpt::ResultOutOfMemory());
|
||||||
|
|
||||||
bool found_abort_flag = false, found_syslog_flag = false;
|
bool found_abort_flag = false, found_syslog_flag = false;
|
||||||
for (u32 i = 0; i < this->ctx->field_count; i++) {
|
for (u32 i = 0; i < this->ctx->field_count; i++) {
|
||||||
if (this->ctx->fields[i].id == FieldId_AbortFlag) {
|
if (this->ctx->fields[i].id == FieldId_AbortFlag) {
|
||||||
@@ -96,10 +236,6 @@ namespace ams::erpt::srv {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ContextRecord *record = new ContextRecord(CategoryId_ErrorInfoDefaults);
|
|
||||||
R_UNLESS(record != nullptr, erpt::ResultOutOfMemory());
|
|
||||||
auto record_guard = SCOPE_GUARD { delete record; };
|
|
||||||
|
|
||||||
if (!found_abort_flag) {
|
if (!found_abort_flag) {
|
||||||
record->Add(FieldId_AbortFlag, false);
|
record->Add(FieldId_AbortFlag, false);
|
||||||
}
|
}
|
||||||
@@ -108,16 +244,19 @@ namespace ams::erpt::srv {
|
|||||||
record->Add(FieldId_HasSyslogFlag, true);
|
record->Add(FieldId_HasSyslogFlag, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
R_TRY(Context::SubmitContextRecord(record));
|
R_TRY(Context::SubmitContextRecord(std::move(record)));
|
||||||
|
|
||||||
record_guard.Cancel();
|
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result Reporter::SubmitReportContexts() {
|
Result Reporter::SubmitReportContexts() {
|
||||||
ContextRecord *record = new ContextRecord(CategoryId_ErrorInfoAuto);
|
auto record = std::make_unique<ContextRecord>(CategoryId_ErrorInfoAuto);
|
||||||
R_UNLESS(record != nullptr, erpt::ResultOutOfMemory());
|
R_UNLESS(record != nullptr, erpt::ResultOutOfMemory());
|
||||||
auto record_guard = SCOPE_GUARD { delete record; };
|
|
||||||
|
/* Handle error context. */
|
||||||
|
if (R_FAILED(this->ctx_result)) {
|
||||||
|
SubmitErrorContext(record.get(), this->ctx_result);
|
||||||
|
}
|
||||||
|
|
||||||
record->Add(FieldId_OsVersion, s_os_version, strnlen(s_os_version, sizeof(s_os_version)));
|
record->Add(FieldId_OsVersion, s_os_version, strnlen(s_os_version, sizeof(s_os_version)));
|
||||||
record->Add(FieldId_PrivateOsVersion, s_private_os_version, strnlen(s_private_os_version, sizeof(s_private_os_version)));
|
record->Add(FieldId_PrivateOsVersion, s_private_os_version, strnlen(s_private_os_version, sizeof(s_private_os_version)));
|
||||||
@@ -149,11 +288,13 @@ namespace ams::erpt::srv {
|
|||||||
record->Add(FieldId_ApplicationAliveTime, (this->occurrence_tick - *s_application_launch_time).ToTimeSpan().GetSeconds());
|
record->Add(FieldId_ApplicationAliveTime, (this->occurrence_tick - *s_application_launch_time).ToTimeSpan().GetSeconds());
|
||||||
}
|
}
|
||||||
|
|
||||||
R_TRY(Context::SubmitContextRecord(record));
|
R_TRY(Context::SubmitContextRecord(std::move(record)));
|
||||||
record_guard.Cancel();
|
|
||||||
|
|
||||||
R_TRY(Context::SubmitContext(this->ctx, this->data, this->data_size));
|
R_TRY(Context::SubmitContext(this->ctx, this->data, this->data_size));
|
||||||
|
|
||||||
|
/* Submit context for resource limits. */
|
||||||
|
SubmitResourceLimitContexts();
|
||||||
|
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,17 +306,22 @@ namespace ams::erpt::srv {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Result Reporter::CreateReportFile() {
|
Result Reporter::CreateReportFile() {
|
||||||
/* Make a journal record. */
|
/* Define journal record deleter. */
|
||||||
auto *record = new JournalRecord<ReportInfo>;
|
struct JournalRecordDeleter {
|
||||||
R_UNLESS(record != nullptr, erpt::ResultOutOfMemory());
|
void operator()(JournalRecord<ReportInfo> *record) {
|
||||||
|
if (record != nullptr) {
|
||||||
record->AddReference();
|
if (record->RemoveReference()) {
|
||||||
ON_SCOPE_EXIT {
|
delete record;
|
||||||
if (record->RemoveReference()) {
|
}
|
||||||
delete record;
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Make a journal record. */
|
||||||
|
auto record = std::unique_ptr<JournalRecord<ReportInfo>, JournalRecordDeleter>{new JournalRecord<ReportInfo>, JournalRecordDeleter{}};
|
||||||
|
R_UNLESS(record != nullptr, erpt::ResultOutOfMemory());
|
||||||
|
record->AddReference();
|
||||||
|
|
||||||
record->info.type = this->type;
|
record->info.type = this->type;
|
||||||
record->info.id = this->report_id;
|
record->info.id = this->report_id;
|
||||||
record->info.flags = erpt::srv::MakeNoReportFlags();
|
record->info.flags = erpt::srv::MakeNoReportFlags();
|
||||||
@@ -188,15 +334,16 @@ namespace ams::erpt::srv {
|
|||||||
record->info.flags.Set<ReportFlag::HasAttachment>();
|
record->info.flags.Set<ReportFlag::HasAttachment>();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto report = std::make_unique<Report>(record, s_redirect_new_reports);
|
auto report = std::make_unique<Report>(record.get(), s_redirect_new_reports);
|
||||||
R_UNLESS(report != nullptr, erpt::ResultOutOfMemory());
|
R_UNLESS(report != nullptr, erpt::ResultOutOfMemory());
|
||||||
|
auto report_guard = SCOPE_GUARD { report->Delete(); };
|
||||||
|
|
||||||
R_TRY(Context::WriteContextsToReport(report.get()));
|
R_TRY(Context::WriteContextsToReport(report.get()));
|
||||||
R_TRY(report->GetSize(std::addressof(record->info.report_size)));
|
R_TRY(report->GetSize(std::addressof(record->info.report_size)));
|
||||||
|
|
||||||
if (!s_redirect_new_reports) {
|
if (!s_redirect_new_reports) {
|
||||||
/* If we're not redirecting new reports, then we want to store the report in the journal. */
|
/* If we're not redirecting new reports, then we want to store the report in the journal. */
|
||||||
R_TRY(Journal::Store(record));
|
R_TRY(Journal::Store(record.get()));
|
||||||
} else {
|
} else {
|
||||||
/* If we are redirecting new reports, we don't want to store the report in the journal. */
|
/* If we are redirecting new reports, we don't want to store the report in the journal. */
|
||||||
/* We should take this opportunity to delete any attachments associated with the report. */
|
/* We should take this opportunity to delete any attachments associated with the report. */
|
||||||
@@ -205,6 +352,7 @@ namespace ams::erpt::srv {
|
|||||||
|
|
||||||
R_TRY(Journal::Commit());
|
R_TRY(Journal::Commit());
|
||||||
|
|
||||||
|
report_guard.Cancel();
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ namespace ams::erpt::srv {
|
|||||||
os::Tick occurrence_tick;
|
os::Tick occurrence_tick;
|
||||||
s64 steady_clock_internal_offset_seconds;
|
s64 steady_clock_internal_offset_seconds;
|
||||||
ReportId report_id;
|
ReportId report_id;
|
||||||
|
Result ctx_result;
|
||||||
time::SteadyClockTimePoint steady_clock_current_timepoint;
|
time::SteadyClockTimePoint steady_clock_current_timepoint;
|
||||||
public:
|
public:
|
||||||
static void ClearApplicationLaunchTime() { s_application_launch_time = std::nullopt; }
|
static void ClearApplicationLaunchTime() { s_application_launch_time = std::nullopt; }
|
||||||
@@ -75,7 +76,7 @@ namespace ams::erpt::srv {
|
|||||||
void SaveSyslogReportIfRequired();
|
void SaveSyslogReportIfRequired();
|
||||||
void SaveSyslogReport();
|
void SaveSyslogReport();
|
||||||
public:
|
public:
|
||||||
Reporter(ReportType type, const ContextEntry *ctx, const u8 *data, u32 data_size, const ReportMetaData *meta, const AttachmentId *attachments, u32 num_attachments);
|
Reporter(ReportType type, const ContextEntry *ctx, const u8 *data, u32 data_size, const ReportMetaData *meta, const AttachmentId *attachments, u32 num_attachments, Result ctx_result);
|
||||||
|
|
||||||
Result CreateReport();
|
Result CreateReport();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ namespace ams::erpt::srv {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Result Stream::GetStreamSize(s64 *out) {
|
Result Stream::GetStreamSize(s64 *out) const {
|
||||||
return GetStreamSize(out, this->file_name);
|
return GetStreamSize(out, this->file_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ namespace ams::erpt::srv {
|
|||||||
Result WriteStream(const u8 *src, u32 src_size);
|
Result WriteStream(const u8 *src, u32 src_size);
|
||||||
void CloseStream();
|
void CloseStream();
|
||||||
|
|
||||||
Result GetStreamSize(s64 *out);
|
Result GetStreamSize(s64 *out) const;
|
||||||
private:
|
private:
|
||||||
Result Flush();
|
Result Flush();
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -601,7 +601,7 @@ namespace ams::fssystem::save {
|
|||||||
this->base_storage = base_storage;
|
this->base_storage = base_storage;
|
||||||
this->buffer_manager = buffer_manager;
|
this->buffer_manager = buffer_manager;
|
||||||
this->block_size = block_size;
|
this->block_size = block_size;
|
||||||
this->cache_count = cache_count;
|
this->cache_count = buffer_count;
|
||||||
|
|
||||||
/* Allocate the caches. */
|
/* Allocate the caches. */
|
||||||
this->caches.reset(new Cache[buffer_count]);
|
this->caches.reset(new Cache[buffer_count]);
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ namespace ams {
|
|||||||
static constexpr BaseType DescriptionBits = 13;
|
static constexpr BaseType DescriptionBits = 13;
|
||||||
static constexpr BaseType ReservedBits = 10;
|
static constexpr BaseType ReservedBits = 10;
|
||||||
static_assert(ModuleBits + DescriptionBits + ReservedBits == sizeof(BaseType) * CHAR_BIT, "ModuleBits + DescriptionBits + ReservedBits == sizeof(BaseType) * CHAR_BIT");
|
static_assert(ModuleBits + DescriptionBits + ReservedBits == sizeof(BaseType) * CHAR_BIT, "ModuleBits + DescriptionBits + ReservedBits == sizeof(BaseType) * CHAR_BIT");
|
||||||
|
private:
|
||||||
|
static constexpr ALWAYS_INLINE BaseType GetBitsValue(BaseType v, int ofs, int num) {
|
||||||
|
return (v >> ofs) & ~(~BaseType() << num);
|
||||||
|
}
|
||||||
public:
|
public:
|
||||||
static constexpr ALWAYS_INLINE BaseType MakeValue(BaseType module, BaseType description) {
|
static constexpr ALWAYS_INLINE BaseType MakeValue(BaseType module, BaseType description) {
|
||||||
return (module) | (description << ModuleBits);
|
return (module) | (description << ModuleBits);
|
||||||
@@ -43,11 +47,23 @@ namespace ams {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static constexpr ALWAYS_INLINE BaseType GetModuleFromValue(BaseType value) {
|
static constexpr ALWAYS_INLINE BaseType GetModuleFromValue(BaseType value) {
|
||||||
return value & ~(~BaseType() << ModuleBits);
|
return GetBitsValue(value, 0, ModuleBits);
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr ALWAYS_INLINE BaseType GetDescriptionFromValue(BaseType value) {
|
static constexpr ALWAYS_INLINE BaseType GetDescriptionFromValue(BaseType value) {
|
||||||
return ((value >> ModuleBits) & ~(~BaseType() << DescriptionBits));
|
return GetBitsValue(value, ModuleBits, DescriptionBits);
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr ALWAYS_INLINE BaseType GetReservedFromValue(BaseType value) {
|
||||||
|
return GetBitsValue(value, ModuleBits + DescriptionBits, ReservedBits);
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr ALWAYS_INLINE BaseType MaskReservedFromValue(BaseType value) {
|
||||||
|
return value & ~(~(~BaseType() << ReservedBits) << (ModuleBits + DescriptionBits));
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr ALWAYS_INLINE BaseType MergeValueWithReserved(BaseType value, BaseType reserved) {
|
||||||
|
return (value << 0) | (reserved << (ModuleBits + DescriptionBits));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -62,14 +78,14 @@ namespace ams {
|
|||||||
constexpr ALWAYS_INLINE BaseType GetDescription() const { return ResultTraits::GetDescriptionFromValue(static_cast<const Self *>(this)->GetValue()); }
|
constexpr ALWAYS_INLINE BaseType GetDescription() const { return ResultTraits::GetDescriptionFromValue(static_cast<const Self *>(this)->GetValue()); }
|
||||||
};
|
};
|
||||||
|
|
||||||
class ResultConstructor;
|
class ResultInternalAccessor;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ResultSuccess;
|
class ResultSuccess;
|
||||||
|
|
||||||
class Result final : public result::impl::ResultBase<Result> {
|
class Result final : public result::impl::ResultBase<Result> {
|
||||||
friend class ResultConstructor;
|
friend class result::impl::ResultInternalAccessor;
|
||||||
public:
|
public:
|
||||||
using Base = typename result::impl::ResultBase<Result>;
|
using Base = typename result::impl::ResultBase<Result>;
|
||||||
private:
|
private:
|
||||||
@@ -97,15 +113,23 @@ namespace ams {
|
|||||||
|
|
||||||
namespace result::impl {
|
namespace result::impl {
|
||||||
|
|
||||||
class ResultConstructor {
|
class ResultInternalAccessor {
|
||||||
public:
|
public:
|
||||||
static constexpr ALWAYS_INLINE Result MakeResult(ResultTraits::BaseType value) {
|
static constexpr ALWAYS_INLINE Result MakeResult(ResultTraits::BaseType value) {
|
||||||
return Result(value);
|
return Result(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static constexpr ALWAYS_INLINE ResultTraits::BaseType GetReserved(Result result) {
|
||||||
|
return ResultTraits::GetReservedFromValue(result.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr ALWAYS_INLINE Result MergeReserved(Result result, ResultTraits::BaseType reserved) {
|
||||||
|
return Result(ResultTraits::MergeValueWithReserved(ResultTraits::MaskReservedFromValue(result.value), reserved));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr ALWAYS_INLINE Result MakeResult(ResultTraits::BaseType value) {
|
constexpr ALWAYS_INLINE Result MakeResult(ResultTraits::BaseType value) {
|
||||||
return ResultConstructor::MakeResult(value);
|
return ResultInternalAccessor::MakeResult(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -119,8 +143,6 @@ namespace ams {
|
|||||||
|
|
||||||
constexpr ALWAYS_INLINE bool IsSuccess() const { return true; }
|
constexpr ALWAYS_INLINE bool IsSuccess() const { return true; }
|
||||||
constexpr ALWAYS_INLINE bool IsFailure() const { return !this->IsSuccess(); }
|
constexpr ALWAYS_INLINE bool IsFailure() const { return !this->IsSuccess(); }
|
||||||
constexpr ALWAYS_INLINE typename Base::BaseType GetModule() const { return Base::GetModule(); }
|
|
||||||
constexpr ALWAYS_INLINE typename Base::BaseType GetDescription() const { return Base::GetDescription(); }
|
|
||||||
|
|
||||||
constexpr ALWAYS_INLINE typename Base::BaseType GetValue() const { return Base::SuccessValue; }
|
constexpr ALWAYS_INLINE typename Base::BaseType GetValue() const { return Base::SuccessValue; }
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -22,4 +22,19 @@ namespace ams {
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
using Span = std::span<T>;
|
using Span = std::span<T>;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
constexpr Span<T> MakeSpan(T *ptr, size_t size) { return { ptr, size }; }
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
constexpr Span<T> MakeSpan(T *begin, T *end) { return { begin, end }; }
|
||||||
|
|
||||||
|
template<typename T, size_t Size>
|
||||||
|
constexpr Span<T> MakeSpan(T (&arr)[Size]) { return Span<T>(arr); }
|
||||||
|
|
||||||
|
template<typename T, size_t Size>
|
||||||
|
constexpr Span<T> MakeSpan(std::array<T, Size> &arr) { return Span<T>(arr); }
|
||||||
|
|
||||||
|
template<typename T, size_t Size>
|
||||||
|
constexpr Span<T> MakeSpan(const std::array<T, Size> &arr) { return Span<const T>(arr); }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,3 +41,4 @@
|
|||||||
#include <vapours/util/util_string_util.hpp>
|
#include <vapours/util/util_string_util.hpp>
|
||||||
#include <vapours/util/util_variadic.hpp>
|
#include <vapours/util/util_variadic.hpp>
|
||||||
#include <vapours/util/util_format_string.hpp>
|
#include <vapours/util/util_format_string.hpp>
|
||||||
|
#include <vapours/util/util_range.hpp>
|
||||||
|
|||||||
47
libraries/libvapours/include/vapours/util/util_range.hpp
Normal file
47
libraries/libvapours/include/vapours/util/util_range.hpp
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <vapours/common.hpp>
|
||||||
|
#include <vapours/assert.hpp>
|
||||||
|
|
||||||
|
namespace ams::util::range {
|
||||||
|
|
||||||
|
template<typename T, typename F>
|
||||||
|
constexpr bool any_of(T &&t, F &&f) {
|
||||||
|
return std::any_of(std::begin(t), std::end(t), std::forward<F>(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename F>
|
||||||
|
constexpr bool all_of(T &&t, F &&f) {
|
||||||
|
return std::all_of(std::begin(t), std::end(t), std::forward<F>(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename F>
|
||||||
|
constexpr bool none_of(T &&t, F &&f) {
|
||||||
|
return std::none_of(std::begin(t), std::end(t), std::forward<F>(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename F>
|
||||||
|
constexpr auto find_if(T &&t, F &&f) {
|
||||||
|
return std::find_if(std::begin(t), std::end(t), std::forward<F>(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename F>
|
||||||
|
constexpr auto for_each(T &&t, F &&f) {
|
||||||
|
return std::for_each(std::begin(t), std::end(t), std::forward<F>(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -180,6 +180,7 @@ constexpr const RegisterWrite DisplayConfigDsi01Init03[] = {
|
|||||||
{sizeof(u32) * DSI_PKT_SEQ_3_HI, 0},
|
{sizeof(u32) * DSI_PKT_SEQ_3_HI, 0},
|
||||||
{sizeof(u32) * DSI_PKT_SEQ_4_HI, 0},
|
{sizeof(u32) * DSI_PKT_SEQ_4_HI, 0},
|
||||||
{sizeof(u32) * DSI_PKT_SEQ_5_HI, 0},
|
{sizeof(u32) * DSI_PKT_SEQ_5_HI, 0},
|
||||||
|
{sizeof(u32) * DSI_CONTROL, 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr const RegisterWrite DisplayConfigDsi01Init04Erista[] = {
|
constexpr const RegisterWrite DisplayConfigDsi01Init04Erista[] = {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
"filesystem_access": {
|
"filesystem_access": {
|
||||||
"permissions": "0xFFFFFFFFFFFFFFFF"
|
"permissions": "0xFFFFFFFFFFFFFFFF"
|
||||||
},
|
},
|
||||||
"service_access": ["lm", "fsp-srv", "time:u", "set", "set:sys", "srepo:u", "psc:m", "csrng"],
|
"service_access": ["lm", "fsp-srv", "time:u", "set", "set:sys", "srepo:u", "psc:m", "csrng", "ectx:r"],
|
||||||
"service_host": ["erpt:r", "erpt:c"],
|
"service_host": ["erpt:r", "erpt:c"],
|
||||||
"kernel_capabilities": [{
|
"kernel_capabilities": [{
|
||||||
"type": "kernel_flags",
|
"type": "kernel_flags",
|
||||||
|
|||||||
@@ -73,6 +73,9 @@ void __appInit(void) {
|
|||||||
R_ABORT_UNLESS(setsysInitialize());
|
R_ABORT_UNLESS(setsysInitialize());
|
||||||
R_ABORT_UNLESS(pscmInitialize());
|
R_ABORT_UNLESS(pscmInitialize());
|
||||||
R_ABORT_UNLESS(time::Initialize());
|
R_ABORT_UNLESS(time::Initialize());
|
||||||
|
if (hos::GetVersion() >= hos::Version_11_0_0) {
|
||||||
|
R_ABORT_UNLESS(ectxrInitialize());
|
||||||
|
}
|
||||||
R_ABORT_UNLESS(fsInitialize());
|
R_ABORT_UNLESS(fsInitialize());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -217,6 +217,10 @@ CATEGORIES = {
|
|||||||
123 : 'UsbStateInfo',
|
123 : 'UsbStateInfo',
|
||||||
124 : 'NvHostErrInfo',
|
124 : 'NvHostErrInfo',
|
||||||
125 : 'RunningUlaInfo',
|
125 : 'RunningUlaInfo',
|
||||||
|
126 : 'InternalPanelInfo',
|
||||||
|
127 : 'ResourceLimitLimitInfo',
|
||||||
|
128 : 'ResourceLimitPeakInfo',
|
||||||
|
129 : 'TouchScreenInfo',
|
||||||
}
|
}
|
||||||
|
|
||||||
FIELD_TYPES = {
|
FIELD_TYPES = {
|
||||||
|
|||||||
Reference in New Issue
Block a user