Compare commits
242 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c7fb3f7203 | ||
|
|
04beea44b0 | ||
|
|
d3bafc5b3b | ||
|
|
2c9e1a814c | ||
|
|
df012e6e21 | ||
|
|
2420b26981 | ||
|
|
c1d68d7f0d | ||
|
|
7cead4b620 | ||
|
|
27202b2fab | ||
|
|
1556a92a38 | ||
|
|
206b1a1b57 | ||
|
|
a26e157579 | ||
|
|
9578622abf | ||
|
|
d4f99ddb4d | ||
|
|
0105455086 | ||
|
|
28717bfd27 | ||
|
|
71fd69eb5a | ||
|
|
9d7b52e2d4 | ||
|
|
255e46e6d2 | ||
|
|
7472bc1c7f | ||
|
|
3c7ece2f8b | ||
|
|
a7e89c6dbb | ||
|
|
b0cae74bb9 | ||
|
|
889ea5e5aa | ||
|
|
7e6ff1f327 | ||
|
|
ea49c2ccd1 | ||
|
|
d484872a73 | ||
|
|
6ee525201c | ||
|
|
5ac7ae7edb | ||
|
|
0c590eb768 | ||
|
|
bd40d4f237 | ||
|
|
788436b4a3 | ||
|
|
2bb77237bc | ||
|
|
33827fe3a3 | ||
|
|
48b0b2fc46 | ||
|
|
4f29eedfe9 | ||
|
|
66372e2b2e | ||
|
|
2bae1ad116 | ||
|
|
bbdc643b6d | ||
|
|
a66fcde0ee | ||
|
|
7835486a4d | ||
|
|
90367aea0d | ||
|
|
16c638756c | ||
|
|
b08a97d883 | ||
|
|
746dbfe018 | ||
|
|
733f2b3cdd | ||
|
|
ad64cb5212 | ||
|
|
b1a9e8d0df | ||
|
|
4f9838df3c | ||
|
|
f4ca2c02a7 | ||
|
|
e1391d4162 | ||
|
|
8d9c51f204 | ||
|
|
c10ba67973 | ||
|
|
55610694c8 | ||
|
|
8764d94fd9 | ||
|
|
5228768841 | ||
|
|
9c68bea16c | ||
|
|
5484740cab | ||
|
|
421324b498 | ||
|
|
37e065fa2d | ||
|
|
b758e3fc55 | ||
|
|
393596ef9a | ||
|
|
02d4c97c6d | ||
|
|
2c5ef434f0 | ||
|
|
122f3e4403 | ||
|
|
ea3ebbaa7d | ||
|
|
1636668762 | ||
|
|
c6b9a0c4bf | ||
|
|
93a218abeb | ||
|
|
d7a06057eb | ||
|
|
8cb77ac136 | ||
|
|
4059dc6187 | ||
|
|
15773e4755 | ||
|
|
4f455dacf4 | ||
|
|
0b22af1206 | ||
|
|
ae2fa2fa60 | ||
|
|
6abd756e0c | ||
|
|
535e49a38d | ||
|
|
fbb5730369 | ||
|
|
e5d62025d3 | ||
|
|
89c6fc6437 | ||
|
|
799c158b86 | ||
|
|
8d16d2152b | ||
|
|
635ae4e3da | ||
|
|
59140d8dfa | ||
|
|
2cb8aadafc | ||
|
|
aa0826bb70 | ||
|
|
8bd2a9a23b | ||
|
|
2f959785e1 | ||
|
|
88a86a3363 | ||
|
|
0c7827104f | ||
|
|
c8ed190e5c | ||
|
|
f4dcd1db9b | ||
|
|
bd341d5c00 | ||
|
|
add18d868f | ||
|
|
609a302e16 | ||
|
|
e07011be32 | ||
|
|
bb223eb5ae | ||
|
|
73d904036d | ||
|
|
542833866e | ||
|
|
89c484414b | ||
|
|
fe2dd671fb | ||
|
|
8abee1bdaa | ||
|
|
78a730ddf6 | ||
|
|
a750e55f75 | ||
|
|
c62c4846fc | ||
|
|
8db5b01507 | ||
|
|
a6e405c988 | ||
|
|
6613fda4b1 | ||
|
|
a18a6e87df | ||
|
|
93d83c5bb9 | ||
|
|
6ee8720028 | ||
|
|
600d68bd1a | ||
|
|
0c3a294cbe | ||
|
|
25218795b4 | ||
|
|
a65ec67128 | ||
|
|
5d753f2384 | ||
|
|
1f2de35f94 | ||
|
|
5c140b4f35 | ||
|
|
362ee3cdb0 | ||
|
|
215f1bc8ee | ||
|
|
4d72c2b37a | ||
|
|
dc4dbe29ae | ||
|
|
72dd25a99e | ||
|
|
39d041466d | ||
|
|
442ebff829 | ||
|
|
7e169bc7df | ||
|
|
00f4e5158f | ||
|
|
0c688189f6 | ||
|
|
7cee36544c | ||
|
|
f9c1d5fc1b | ||
|
|
d95e20952c | ||
|
|
32a90334bb | ||
|
|
f534d3498e | ||
|
|
3ea9f444db | ||
|
|
5672c935ed | ||
|
|
4cc2b5c38a | ||
|
|
00e3d874e3 | ||
|
|
803e91a8c4 | ||
|
|
227a1d938d | ||
|
|
fc7f06dc78 | ||
|
|
6777dd9b38 | ||
|
|
4db212ea7b | ||
|
|
8177a27db9 | ||
|
|
27ff119ba6 | ||
|
|
c20774ff5d | ||
|
|
a9f5b7728b | ||
|
|
08ad48fbf3 | ||
|
|
2d0c881ffe | ||
|
|
c916a7db88 | ||
|
|
a5da286351 | ||
|
|
20a48c3a26 | ||
|
|
5bba0f47ff | ||
|
|
bfc987abcd | ||
|
|
85bf7c86e0 | ||
|
|
2225b86eea | ||
|
|
d09be18359 | ||
|
|
09ab3efddd | ||
|
|
382a0192f9 | ||
|
|
e3b968fa80 | ||
|
|
6f85b11fcc | ||
|
|
e561919a52 | ||
|
|
b0a66a63ba | ||
|
|
0d840e199d | ||
|
|
3a2bceef8d | ||
|
|
e871a754a8 | ||
|
|
6333327b81 | ||
|
|
18ca8aaf5b | ||
|
|
67c0f4527e | ||
|
|
e5c5101e8a | ||
|
|
934ff7bbde | ||
|
|
014f08f6b4 | ||
|
|
6ba2090c01 | ||
|
|
61fcf5e0f4 | ||
|
|
9217e4c5f9 | ||
|
|
3ccbb34c62 | ||
|
|
9baa4a17ed | ||
|
|
6bbece39bc | ||
|
|
729447eab0 | ||
|
|
1e7f41ea9f | ||
|
|
d0d4888184 | ||
|
|
804e5d49bb | ||
|
|
6d1d226842 | ||
|
|
06416aeded | ||
|
|
4fbae9e5a4 | ||
|
|
c87be7cd69 | ||
|
|
e62754ed56 | ||
|
|
53d7281e66 | ||
|
|
731a2c11a4 | ||
|
|
ec4d078d6d | ||
|
|
f9b48f06a3 | ||
|
|
d986ffa153 | ||
|
|
2357bc70a7 | ||
|
|
e86e1588e3 | ||
|
|
4be88c7180 | ||
|
|
8e8daa64ba | ||
|
|
1671c04e24 | ||
|
|
d3d6c552b7 | ||
|
|
8d9336f561 | ||
|
|
169ec9c12e | ||
|
|
60b831f369 | ||
|
|
4191dcee75 | ||
|
|
44725c8910 | ||
|
|
cead8a36ea | ||
|
|
7b6050a0cb | ||
|
|
491383c637 | ||
|
|
d7a3645f7f | ||
|
|
241b8f4627 | ||
|
|
3f7238cb10 | ||
|
|
1e8a6358ad | ||
|
|
c412d996fd | ||
|
|
f2086fe054 | ||
|
|
3f9d6574fb | ||
|
|
e996acff66 | ||
|
|
e274d3ef37 | ||
|
|
8663eb1a6e | ||
|
|
938da08e14 | ||
|
|
0468bd9483 | ||
|
|
c077c75b8d | ||
|
|
24f7977fa6 | ||
|
|
6699fda8c9 | ||
|
|
06e4158b93 | ||
|
|
b82d8aaba9 | ||
|
|
6829572556 | ||
|
|
11d8021435 | ||
|
|
493b074a9e | ||
|
|
befd912a88 | ||
|
|
c96ae0148e | ||
|
|
63a9c856fc | ||
|
|
31fde233e1 | ||
|
|
f9bf8923b1 | ||
|
|
ee40dcd76f | ||
|
|
c60ee15449 | ||
|
|
876d94c338 | ||
|
|
7c37b7497b | ||
|
|
dfcba5e6d4 | ||
|
|
a0cf3bbed8 | ||
|
|
1c503d59b5 | ||
|
|
0bf7df0426 | ||
|
|
2c46ec9638 | ||
|
|
ef0c8e0aac | ||
|
|
1a5801ee0f |
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
config_templates/hbl_html/accessible-urls/accessible-urls.txt text eol=lf
|
||||||
6
.gitmodules
vendored
6
.gitmodules
vendored
@@ -1,6 +0,0 @@
|
|||||||
[submodule "common/include/boost"]
|
|
||||||
path = common/include/boost
|
|
||||||
url = https://github.com/Atmosphere-NX/ext-boost.git
|
|
||||||
[submodule "stratosphere/libstratosphere"]
|
|
||||||
path = stratosphere/libstratosphere
|
|
||||||
url = https://github.com/Atmosphere-NX/libstratosphere.git
|
|
||||||
|
|||||||
59
Makefile
59
Makefile
@@ -7,7 +7,7 @@ ifneq (, $(strip $(shell git status --porcelain 2>/dev/null)))
|
|||||||
AMSREV := $(AMSREV)-dirty
|
AMSREV := $(AMSREV)-dirty
|
||||||
endif
|
endif
|
||||||
|
|
||||||
COMPONENTS := fusee stratosphere exosphere thermosphere troposphere
|
COMPONENTS := fusee stratosphere exosphere thermosphere troposphere libraries
|
||||||
|
|
||||||
all: $(COMPONENTS)
|
all: $(COMPONENTS)
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ thermosphere:
|
|||||||
exosphere: thermosphere
|
exosphere: thermosphere
|
||||||
$(MAKE) -C exosphere all
|
$(MAKE) -C exosphere all
|
||||||
|
|
||||||
stratosphere: exosphere
|
stratosphere: exosphere libraries
|
||||||
$(MAKE) -C stratosphere all
|
$(MAKE) -C stratosphere all
|
||||||
|
|
||||||
troposphere: stratosphere
|
troposphere: stratosphere
|
||||||
@@ -29,18 +29,21 @@ sept: exosphere
|
|||||||
fusee: exosphere stratosphere sept
|
fusee: exosphere stratosphere sept
|
||||||
$(MAKE) -C $@ all
|
$(MAKE) -C $@ all
|
||||||
|
|
||||||
|
libraries:
|
||||||
|
$(MAKE) -C libraries all
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(MAKE) -C fusee clean
|
$(MAKE) -C fusee clean
|
||||||
rm -rf out
|
rm -rf out
|
||||||
|
|
||||||
dist: all
|
dist: all
|
||||||
$(eval MAJORVER = $(shell grep '\ATMOSPHERE_RELEASE_VERSION_MAJOR\b' common/include/atmosphere/version.h \
|
$(eval MAJORVER = $(shell grep 'define ATMOSPHERE_RELEASE_VERSION_MAJOR\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
|
||||||
| tr -s [:blank:] \
|
| tr -s [:blank:] \
|
||||||
| cut -d' ' -f3))
|
| cut -d' ' -f3))
|
||||||
$(eval MINORVER = $(shell grep '\ATMOSPHERE_RELEASE_VERSION_MINOR\b' common/include/atmosphere/version.h \
|
$(eval MINORVER = $(shell grep 'define ATMOSPHERE_RELEASE_VERSION_MINOR\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
|
||||||
| tr -s [:blank:] \
|
| tr -s [:blank:] \
|
||||||
| cut -d' ' -f3))
|
| cut -d' ' -f3))
|
||||||
$(eval MICROVER = $(shell grep '\ATMOSPHERE_RELEASE_VERSION_MICRO\b' common/include/atmosphere/version.h \
|
$(eval MICROVER = $(shell grep 'define ATMOSPHERE_RELEASE_VERSION_MICRO\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
|
||||||
| tr -s [:blank:] \
|
| tr -s [:blank:] \
|
||||||
| cut -d' ' -f3))
|
| cut -d' ' -f3))
|
||||||
$(eval AMSVER = $(MAJORVER).$(MINORVER).$(MICROVER)-$(AMSREV))
|
$(eval AMSVER = $(MAJORVER).$(MINORVER).$(MICROVER)-$(AMSREV))
|
||||||
@@ -50,32 +53,38 @@ dist: all
|
|||||||
mkdir atmosphere-$(AMSVER)/atmosphere
|
mkdir atmosphere-$(AMSVER)/atmosphere
|
||||||
mkdir atmosphere-$(AMSVER)/sept
|
mkdir atmosphere-$(AMSVER)/sept
|
||||||
mkdir atmosphere-$(AMSVER)/switch
|
mkdir atmosphere-$(AMSVER)/switch
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/titles/010000000000000D
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000008
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/titles/0100000000000032
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/010000000000000D
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/titles/0100000000000034
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000032
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/titles/0100000000000036
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000034
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/titles/0100000000000037
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000036
|
||||||
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000037
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/fatal_errors
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/fatal_errors
|
||||||
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/config_templates
|
||||||
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/config
|
||||||
cp fusee/fusee-primary/fusee-primary.bin atmosphere-$(AMSVER)/atmosphere/reboot_payload.bin
|
cp fusee/fusee-primary/fusee-primary.bin atmosphere-$(AMSVER)/atmosphere/reboot_payload.bin
|
||||||
|
cp fusee/fusee-mtc/fusee-mtc.bin atmosphere-$(AMSVER)/atmosphere/fusee-mtc.bin
|
||||||
cp fusee/fusee-secondary/fusee-secondary.bin atmosphere-$(AMSVER)/atmosphere/fusee-secondary.bin
|
cp fusee/fusee-secondary/fusee-secondary.bin atmosphere-$(AMSVER)/atmosphere/fusee-secondary.bin
|
||||||
cp fusee/fusee-secondary/fusee-secondary.bin atmosphere-$(AMSVER)/sept/payload.bin
|
cp fusee/fusee-secondary/fusee-secondary.bin atmosphere-$(AMSVER)/sept/payload.bin
|
||||||
cp sept/sept-primary/sept-primary.bin atmosphere-$(AMSVER)/sept/sept-primary.bin
|
cp sept/sept-primary/sept-primary.bin atmosphere-$(AMSVER)/sept/sept-primary.bin
|
||||||
cp sept/sept-secondary/sept-secondary.bin atmosphere-$(AMSVER)/sept/sept-secondary.bin
|
cp sept/sept-secondary/sept-secondary.bin atmosphere-$(AMSVER)/sept/sept-secondary.bin
|
||||||
cp sept/sept-secondary/sept-secondary.enc atmosphere-$(AMSVER)/sept/sept-secondary.enc
|
cp sept/sept-secondary/sept-secondary_00.enc atmosphere-$(AMSVER)/sept/sept-secondary_00.enc
|
||||||
cp common/defaults/BCT.ini atmosphere-$(AMSVER)/atmosphere/BCT.ini
|
cp sept/sept-secondary/sept-secondary_01.enc atmosphere-$(AMSVER)/sept/sept-secondary_01.enc
|
||||||
cp common/defaults/loader.ini atmosphere-$(AMSVER)/atmosphere/loader.ini
|
cp config_templates/BCT.ini atmosphere-$(AMSVER)/atmosphere/config/BCT.ini
|
||||||
cp common/defaults/system_settings.ini atmosphere-$(AMSVER)/atmosphere/system_settings.ini
|
cp config_templates/override_config.ini atmosphere-$(AMSVER)/atmosphere/config_templates/override_config.ini
|
||||||
cp -r common/defaults/kip_patches atmosphere-$(AMSVER)/atmosphere/kip_patches
|
cp config_templates/system_settings.ini atmosphere-$(AMSVER)/atmosphere/config_templates/system_settings.ini
|
||||||
cp -r common/defaults/hbl_html atmosphere-$(AMSVER)/atmosphere/hbl_html
|
cp -r config_templates/kip_patches atmosphere-$(AMSVER)/atmosphere/kip_patches
|
||||||
cp stratosphere/dmnt/dmnt.nsp atmosphere-$(AMSVER)/atmosphere/titles/010000000000000D/exefs.nsp
|
cp -r config_templates/hbl_html atmosphere-$(AMSVER)/atmosphere/hbl_html
|
||||||
cp stratosphere/eclct.stub/eclct.stub.nsp atmosphere-$(AMSVER)/atmosphere/titles/0100000000000032/exefs.nsp
|
cp stratosphere/boot2/boot2.nsp atmosphere-$(AMSVER)/atmosphere/contents/0100000000000008/exefs.nsp
|
||||||
cp stratosphere/fatal/fatal.nsp atmosphere-$(AMSVER)/atmosphere/titles/0100000000000034/exefs.nsp
|
cp stratosphere/dmnt/dmnt.nsp atmosphere-$(AMSVER)/atmosphere/contents/010000000000000D/exefs.nsp
|
||||||
cp stratosphere/creport/creport.nsp atmosphere-$(AMSVER)/atmosphere/titles/0100000000000036/exefs.nsp
|
cp stratosphere/eclct.stub/eclct.stub.nsp atmosphere-$(AMSVER)/atmosphere/contents/0100000000000032/exefs.nsp
|
||||||
cp stratosphere/ro/ro.nsp atmosphere-$(AMSVER)/atmosphere/titles/0100000000000037/exefs.nsp
|
cp stratosphere/fatal/fatal.nsp atmosphere-$(AMSVER)/atmosphere/contents/0100000000000034/exefs.nsp
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/titles/0100000000000032/flags
|
cp stratosphere/creport/creport.nsp atmosphere-$(AMSVER)/atmosphere/contents/0100000000000036/exefs.nsp
|
||||||
touch atmosphere-$(AMSVER)/atmosphere/titles/0100000000000032/flags/boot2.flag
|
cp stratosphere/ro/ro.nsp atmosphere-$(AMSVER)/atmosphere/contents/0100000000000037/exefs.nsp
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/titles/0100000000000037/flags
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000032/flags
|
||||||
touch atmosphere-$(AMSVER)/atmosphere/titles/0100000000000037/flags/boot2.flag
|
touch atmosphere-$(AMSVER)/atmosphere/contents/0100000000000032/flags/boot2.flag
|
||||||
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/contents/0100000000000037/flags
|
||||||
|
touch atmosphere-$(AMSVER)/atmosphere/contents/0100000000000037/flags/boot2.flag
|
||||||
cp troposphere/reboot_to_payload/reboot_to_payload.nro atmosphere-$(AMSVER)/switch/reboot_to_payload.nro
|
cp troposphere/reboot_to_payload/reboot_to_payload.nro atmosphere-$(AMSVER)/switch/reboot_to_payload.nro
|
||||||
cd atmosphere-$(AMSVER); zip -r ../atmosphere-$(AMSVER).zip ./*; cd ../;
|
cd atmosphere-$(AMSVER); zip -r ../atmosphere-$(AMSVER).zip ./*; cd ../;
|
||||||
rm -r atmosphere-$(AMSVER)
|
rm -r atmosphere-$(AMSVER)
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
[hbl_config]
|
|
||||||
title_id=010000000000100D
|
|
||||||
override_any_app=true
|
|
||||||
path=atmosphere/hbl.nsp
|
|
||||||
override_key=R
|
|
||||||
|
|
||||||
[default_config]
|
|
||||||
override_key=!L
|
|
||||||
cheat_enable_key=!L
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
; Disable uploading error reports to Nintendo
|
|
||||||
[eupld]
|
|
||||||
upload_enabled = u8!0x0
|
|
||||||
; Enable USB 3.0 superspeed for homebrew
|
|
||||||
[usb]
|
|
||||||
usb30_force_enabled = u8!0x0
|
|
||||||
; Control whether RO should ease its validation of NROs.
|
|
||||||
; (note: this is normally not necessary, and ips patches can be used.)
|
|
||||||
[ro]
|
|
||||||
ease_nro_restriction = u8!0x0
|
|
||||||
; Atmosphere custom settings
|
|
||||||
[atmosphere]
|
|
||||||
; Reboot from fatal automatically after some number of milliseconds.
|
|
||||||
; If field is not present or 0, fatal will wait indefinitely for user input.
|
|
||||||
fatal_auto_reboot_interval = u64!0x0
|
|
||||||
; Make the power menu's "reboot" button reboot to payload.
|
|
||||||
; Set to "normal" for normal reboot, "rcm" for rcm reboot.
|
|
||||||
power_menu_reboot_function = str!payload
|
|
||||||
; Controls whether dmnt cheats should be toggled on or off by
|
|
||||||
; default. 1 = toggled on by default, 0 = toggled off by default.
|
|
||||||
dmnt_cheats_enabled_by_default = u8!0x1
|
|
||||||
; Controls whether dmnt should always save cheat toggle state
|
|
||||||
; for restoration on new game launch. 1 = always save toggles,
|
|
||||||
; 0 = only save toggles if toggle file exists.
|
|
||||||
dmnt_always_save_cheat_toggles = u8!0x0
|
|
||||||
; Controls whether fs.mitm should redirect save files
|
|
||||||
; to directories on the sd card.
|
|
||||||
; 0 = Do not redirect, 1 = Redirect.
|
|
||||||
; NOTE: EXPERIMENTAL
|
|
||||||
; If you do not know what you are doing, do not touch this yet.
|
|
||||||
fsmitm_redirect_saves_to_sd = u8!0x0
|
|
||||||
Submodule common/include/boost deleted from fc6429e463
@@ -1,16 +1,19 @@
|
|||||||
BCT0
|
BCT0
|
||||||
[stage1]
|
[stage1]
|
||||||
stage2_path = atmosphere/fusee-secondary.bin
|
stage2_path = atmosphere/fusee-secondary.bin
|
||||||
|
stage2_mtc_path = atmosphere/fusee-mtc.bin
|
||||||
stage2_addr = 0xF0000000
|
stage2_addr = 0xF0000000
|
||||||
stage2_entrypoint = 0xF0000000
|
stage2_entrypoint = 0xF0000000
|
||||||
|
|
||||||
[exosphere]
|
[exosphere]
|
||||||
; Note: Disabling debugmode will cause parts of ams.tma to not work, in the future.
|
; Note: Disabling debugmode will cause parts of ams.tma to not work, in the future.
|
||||||
debugmode = 1
|
debugmode = 1
|
||||||
debugmode_user = 0
|
debugmode_user = 0
|
||||||
; Note: Disabling usermode exception handlers will cause atmosphere to not fail gracefully under error conditions.
|
; Note: Disabling usermode exception handlers will cause atmosphere to not fail gracefully under error conditions.
|
||||||
; Support will not be provided to users who disable these. If you do not know what you are doing, leave them on.
|
; Support will not be provided to users who disable these. If you do not know what you are doing, leave them on.
|
||||||
disable_user_exception_handlers = 0
|
disable_user_exception_handlers = 0
|
||||||
|
; Note: It's currently unknown what effects enabling the usermode PMU register access may have on official code.
|
||||||
|
enable_user_pmu_access = 0
|
||||||
|
|
||||||
[stratosphere]
|
[stratosphere]
|
||||||
; To force-enable nogc, add nogc = 1
|
; To force-enable nogc, add nogc = 1
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
10
config_templates/override_config.ini
Normal file
10
config_templates/override_config.ini
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
[hbl_config]
|
||||||
|
; program_id=010000000000100D
|
||||||
|
; override_any_app=true
|
||||||
|
; path=atmosphere/hbl.nsp
|
||||||
|
; override_key=!R
|
||||||
|
; override_any_app_key=R
|
||||||
|
|
||||||
|
[default_config]
|
||||||
|
; override_key=!L
|
||||||
|
; cheat_enable_key=!L
|
||||||
43
config_templates/system_settings.ini
Normal file
43
config_templates/system_settings.ini
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
; Disable uploading error reports to Nintendo
|
||||||
|
[eupld]
|
||||||
|
; upload_enabled = u8!0x0
|
||||||
|
; Control whether RO should ease its validation of NROs.
|
||||||
|
; (note: this is normally not necessary, and ips patches can be used.)
|
||||||
|
[ro]
|
||||||
|
; ease_nro_restriction = u8!0x0
|
||||||
|
; Atmosphere custom settings
|
||||||
|
[atmosphere]
|
||||||
|
; Reboot from fatal automatically after some number of milliseconds.
|
||||||
|
; If field is not present or 0, fatal will wait indefinitely for user input.
|
||||||
|
; fatal_auto_reboot_interval = u64!0x0
|
||||||
|
; Make the power menu's "reboot" button reboot to payload.
|
||||||
|
; Set to "normal" for normal reboot, "rcm" for rcm reboot.
|
||||||
|
; power_menu_reboot_function = str!payload
|
||||||
|
; Controls whether dmnt cheats should be toggled on or off by
|
||||||
|
; default. 1 = toggled on by default, 0 = toggled off by default.
|
||||||
|
; dmnt_cheats_enabled_by_default = u8!0x1
|
||||||
|
; Controls whether dmnt should always save cheat toggle state
|
||||||
|
; for restoration on new game launch. 1 = always save toggles,
|
||||||
|
; 0 = only save toggles if toggle file exists.
|
||||||
|
; dmnt_always_save_cheat_toggles = u8!0x0
|
||||||
|
; Enable writing to BIS partitions for HBL.
|
||||||
|
; This is probably undesirable for normal usage.
|
||||||
|
; enable_hbl_bis_write = u8!0x0
|
||||||
|
; Enable reading the CAL0 partition for HBL.
|
||||||
|
; This is probably undesirable for normal usage.
|
||||||
|
; enable_hbl_cal_read = u8!0x0
|
||||||
|
; Controls whether fs.mitm should redirect save files
|
||||||
|
; to directories on the sd card.
|
||||||
|
; 0 = Do not redirect, 1 = Redirect.
|
||||||
|
; NOTE: EXPERIMENTAL
|
||||||
|
; If you do not know what you are doing, do not touch this yet.
|
||||||
|
; fsmitm_redirect_saves_to_sd = u8!0x0
|
||||||
|
[hbloader]
|
||||||
|
; Controls the size of the homebrew heap when running as applet.
|
||||||
|
; If set to zero, all available applet memory is used as heap.
|
||||||
|
; The default is zero.
|
||||||
|
; applet_heap_size = u64!0x0
|
||||||
|
; Controls the amount of memory to reserve when running as applet
|
||||||
|
; for usage by other applets. This setting has no effect if
|
||||||
|
; applet_heap_size is non-zero. The default is 0x8600000.
|
||||||
|
; applet_heap_reservation_size = u64!0x8600000
|
||||||
@@ -1,4 +1,165 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
## 0.10.1
|
||||||
|
+ A bug was fixed that caused memory reallocation to the system pool to work improperly on firmware 5.0.0 and above.
|
||||||
|
+ Atmosphere was always trying to deallocate memory away from the applet pool and towards the system pool.
|
||||||
|
+ The intent of this is to facilitate running more custom sysmodules/atmosphere binaries.
|
||||||
|
+ However, while memory was always successfully taken away from the applet pool, on 5.0.0+ granting it to the system pool did not work for technical reasons.
|
||||||
|
+ If you are interested in the technical details, talk to SciresM.
|
||||||
|
+ This has now been fixed by adding new kernel patches, and memory is correctly granted to the system pool as intended.
|
||||||
|
+ Atmosphere's library system has been overhauled:
|
||||||
|
+ libstratosphere's repository has been rebranded, more generally, to "Atmosphere-libs".
|
||||||
|
+ In addition to libstratosphere, a new general library for not-stratosphere-specific code has been added.
|
||||||
|
+ This is currently named `libvapours`.
|
||||||
|
+ In the future, kernel functionality will be available as `libmesosphere`.
|
||||||
|
+ The build system for stratosphere system modules has been similarly overhauled.
|
||||||
|
+ A number of other bugs were fixed, including:
|
||||||
|
+ A bug was fixed that could cause memory corruption when redirecting certain Romfs content.
|
||||||
|
+ A bug was fixed that could cause an infinite loop when redirecting certain Romfs content.
|
||||||
|
+ A bug was fixed that could cause certain NROs to fail to load.
|
||||||
|
+ This caused the latest version of Super Smash Bros to display "An error has occurred" on launch.
|
||||||
|
+ A bug was fixed that caused input/output array sizes for certain circumstances to be calculated incorrectly.
|
||||||
|
+ This caused cheats to fail to function properly.
|
||||||
|
+ C++ exception code is now more thoroughly removed from stratosphere executables.
|
||||||
|
+ This saves a minor amount of memory.
|
||||||
|
+ A number of minor logic inversions were fixed in libstratosphere.
|
||||||
|
+ These did not affect any code currently used by released Atmosphere binaries.
|
||||||
|
+ *Please note**: Because this update is releasing so soon after 0.10.0, the removal of the temporary hid-mitm has been postponed to 0.10.2.
|
||||||
|
+ Please ensure your homebrew is updated.
|
||||||
|
+ Random number generation now uses TinyMT instead of XorShift.
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
## 0.10.0
|
||||||
|
+ Support was added for 9.1.0
|
||||||
|
+ **Please note**: The temporary hid-mitm added in Atmosphere 0.9.0 will be removed in Atmosphere 0.10.1.
|
||||||
|
+ Please ensure your homebrew is updated.
|
||||||
|
+ The Stratosphere rewrite was completed.
|
||||||
|
+ libstratosphere was rewritten as part of Stratosphere's refactor.
|
||||||
|
+ Code responsible for providing and managing IPC services was greatly improved.
|
||||||
|
+ The new code is significantly more accurate (it is bug-for-bug compatible with Nintendo's code), and significantly faster.
|
||||||
|
+ ams.mitm was rewritten as part of Stratosphere's refactor.
|
||||||
|
+ Saves redirected to the SD card are now separated for sysmmc vs emummc.
|
||||||
|
+ **Please note**: If you find any bugs, please report them so they can be fixed.
|
||||||
|
+ Thanks to the rewrite, Atmosphere now uses significantly less memory.
|
||||||
|
+ Roughly 10 additional megabytes are now available for custom system modules to use.
|
||||||
|
+ This means you can potentially run more custom system modules simultaneously.
|
||||||
|
+ If system modules are incompatible, please ask their authors to reduce their memory footprints.
|
||||||
|
+ Atmosphere's configuration layout has had major changes.
|
||||||
|
+ Configuration now lives inside /atmosphere/config/.
|
||||||
|
+ Atmosphere code now knows what default values should be, and includes them in code.
|
||||||
|
+ It is no longer an error if configuration inis are not present.
|
||||||
|
+ Correspondingly, Atmosphere no longer distributes default configuration inis.
|
||||||
|
+ Templates are provided in /atmosphere/config_templates.
|
||||||
|
+ loader.ini was renamed to override_config.ini.
|
||||||
|
+ This fixes the longstanding problem that atmosphere updates overwrote user configuration when extracted.
|
||||||
|
+ Atmosphere's process override layout was changed.
|
||||||
|
+ Atmosphere now uses the /atmosphere/contents directory, instead of /atmosphere/titles.
|
||||||
|
+ This goes along with a refactoring to remove all reference to "title id" from code, as Nintendo does not use the term.
|
||||||
|
+ To make this transition easier, a temporary functionality has been added that migrates folders to the new directory.
|
||||||
|
+ When booting into 0.10.0, Atmosphere will rename /atmosphere/titles/`<program id>` to /atmosphere/contents/`<program id>`.
|
||||||
|
+ This functionality may or may not be removed in some future update.
|
||||||
|
+ This should solve any transition difficulties for the typical user.
|
||||||
|
+ Please make sure that any future mods you install extract to the correct directory.
|
||||||
|
+ Support for configuring override keys for hbl was improved.
|
||||||
|
+ The key used to override applications versus a specific program can now be different.
|
||||||
|
+ The key to override a specific program can be managed via override_key.
|
||||||
|
+ The key to override any app can be managed via override_any_app_key.
|
||||||
|
+ Default override behavior was changed.
|
||||||
|
+ By default, atmosphere will now override the album applet with hbl unless R is held.
|
||||||
|
+ By default, atmosphere will now override any application with hbl only if R is held.
|
||||||
|
+ The default amount of applet memory reserved has been slightly increased.
|
||||||
|
+ This allows the profile selector applet to work by default in applet mode.
|
||||||
|
+ The way process override status is captured was changed.
|
||||||
|
+ Process override keys are now captured exactly once, when the process is created.
|
||||||
|
+ This fixes the longstanding issue where letting go of the override button partway into the process launch could cause problems.
|
||||||
|
+ The Mitm API was changed to pass around override status.
|
||||||
|
+ Mitm services now know what keys were held when the client was created, as well as whether the client is HBL/should override contents.
|
||||||
|
+ An extension was added to pm:info to allow querying a process's override status.
|
||||||
|
+ Thanks to process override capture improvements, hbl html behavior has been greatly improved.
|
||||||
|
+ Web applets launched by hbl will now always see the /atmosphere/hbl_html filesystem
|
||||||
|
+ Support was added to exosphere for enabling usermode access to the PMU registers.
|
||||||
|
+ This can be controlled via exosphere!enable_user_pmu_access in BCT.ini.
|
||||||
|
+ An enormous number of minor bugs were fixed.
|
||||||
|
+ dmnt's cheat VM had a fix for an inversion in opcode behavior.
|
||||||
|
+ An issue was fixed in fs.mitm's management of domain object IDs that could lead to system corruption in rare cases.
|
||||||
|
+ The Mitm API no longer silently fails when attempting to handle commands passing C descriptors.
|
||||||
|
+ On previous atmosphere versions, certain commands to FS would silently fail due to this...
|
||||||
|
+ No users reported any visible errors, but it was definitely a problem behind the scenes.
|
||||||
|
+ These commands are now handled correctly.
|
||||||
|
+ Atmosphere can now display a fatal error screen significantly earlier in the boot process, if things go wrong early on.
|
||||||
|
+ The temporary hid mitm will no longer sometimes cause games to fail to detect input.
|
||||||
|
+ Mitm Domain object ID management no longer desynchronizes from the host process.
|
||||||
|
+ An issue was fixed that could cause service acquisition to hang forever if certain sm commands were called in a precise order.
|
||||||
|
+ An off-by-one was fixed that could cause memory corruption in server memory management.
|
||||||
|
+ ... and too many more bugs fixed to reasonably list them all :)
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
## 0.9.4
|
||||||
|
+ Support was added for 9.0.0.
|
||||||
|
+ **Please note**: 9.0.0 made a number of changes that may cause some issues with homebrew. Details:
|
||||||
|
+ 9.0.0 changed HID in a way that causes libnx to be unable to detect button input.
|
||||||
|
+ Homebrew should be recompiled with newest libnx to fix this.
|
||||||
|
+ Atmosphere now provides a temporary hid-mitm that will cause homebrew to continue to work as expected.
|
||||||
|
+ This mitm will be removed in a future Atmosphere revision once homebrew has been updated, to allow users to use a custom hid mitm again if they desire.
|
||||||
|
+ 9.0.0 introduced an dependency in FS on the USB system module in order to launch the SD card.
|
||||||
|
+ This means the USB system module must now be launched before the SD card is initialized.
|
||||||
|
+ Correspondingly, the USB system module can no longer be IPS patched, and its settings cannot be reliably mitm'd.
|
||||||
|
+ We know this is frustrating, so we'll be looking into whether there is some way of addressing this in the future.
|
||||||
|
+ An off-by-one error was fixed in `boot` system module's pinmux initialization.
|
||||||
|
+ This could theoretically have caused issues with HdmiCec communication.
|
||||||
|
+ No users reported issues, so it's unclear if this was a problem in practice.
|
||||||
|
+ A bug was fixed that could cause webapplet launching homebrew to improperly set the accessible url whitelist.
|
||||||
|
+ BIS key generation has been fixed for newer hardware.
|
||||||
|
+ Newer hardware uses new, per-firmware device key to generate BIS keys instead of the first device key, so previously the wrong keys were generated as backup.
|
||||||
|
+ This only affects units manufactured after ~5.0.0.
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
## 0.9.3
|
||||||
|
+ Thanks to hexkyz, fusee's boot sequence has been greatly optimized.
|
||||||
|
+ Memory training is now managed by a separate binary (`fusee-mtc`, loaded by fusee-primary before fusee-secondary).
|
||||||
|
+ Unnecessarily long splash screen display times were reduced.
|
||||||
|
+ The end result is that Atmosphere now boots *significantly* faster. :)
|
||||||
|
+ **Note:** This means fusee-primary must be updated for Atmosphere to boot successfully.
|
||||||
|
+ The version string was adjusted, and now informs users whether or not they are using emummc.
|
||||||
|
+ Atmosphere now automatically backs up the user's BIS keys on boot.
|
||||||
|
+ This should prevent a user from corrupting nand without access to a copy of the keys needed to fix it.
|
||||||
|
+ This is especially relevant on ipatched units, where the RCM vulnerability is not an option for addressing bricks.
|
||||||
|
+ The `pm` system module was rewritten as part of Stratosphere's ongoing refactor.
|
||||||
|
+ Support was added for forward-declaring a mitm'd service before a custom user sysmodule is launched.
|
||||||
|
+ This should help resolve dependency issues with service registration times.
|
||||||
|
+ SM is now informed of every process's title id, including built-in system modules.
|
||||||
|
+ The `creport` system module was rewritten as part of Stratosphere's ongoing refactor.
|
||||||
|
+ creport now dumps up to 0x100 of stack from each thread in the target process.
|
||||||
|
+ A few bugs were fixed, including one that caused creport to incorrectly dump process dying messages.
|
||||||
|
+ Defaults were added to `system_settings.ini` for controlling hbloader's memory usage in applet mode.
|
||||||
|
+ These defaults reserve enough memory so that homebrew can launch swkbd while in applet mode.
|
||||||
|
+ The `fatal` system module was rewritten as part of Stratosphere's ongoing refactor.
|
||||||
|
+ Incorrect display output ("2000-0000") has been fixed. Fatal will now correctly show 2162-0002 when this occurs.
|
||||||
|
+ A longstanding bug in how fatal manages the displays has been fixed, and official display init behavior is now matched precisely.
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
## 0.9.2
|
||||||
|
+ A number of emummc bugfixes were added (all thanks to @m4xw's hard work). The following is a summary of emummc changes:
|
||||||
|
+ Support for file-based emummc instances was fixed.
|
||||||
|
+ Please note: file-based emummc is still unoptimized, and so may be much slower than partition-based.
|
||||||
|
+ This speed differential should hopefully be made better in a future emummc update.
|
||||||
|
+ The way emummc handles power management was completely overhauled.
|
||||||
|
+ Emummc now properly handles init/de-init, and now supports low voltage mode.
|
||||||
|
+ Much better support for shutdown was added, which should assuage corruption/synchronization problems.
|
||||||
|
+ This should also improve support for more types of SD cards.
|
||||||
|
+ A bug was fixed that caused emummc to not work on lower system versions due to missing SVC access.
|
||||||
|
+ **Please note**: The configuration entries used for emummc have been changed.
|
||||||
|
+ `emummc_` prefixes have been removed, since they are superfluous given the `emummc` category they are under.
|
||||||
|
+ As an example, `emummc!emummc_enabled` is now `emummc!enabled`.
|
||||||
|
+ INI configurations made by @CTCaer's [tool](https://github.com/ctcaer/hekate/releases/latest) (which is the recommended way to manage emummc) should automatically work as expected/be corrected.
|
||||||
|
+ **If you do not wish to use the above, you will need to manually correct your configuration file**.
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
+ Stratosphere is currently in the process of being re-written/refactored.
|
||||||
|
+ Stratosphere was my (SciresM's) first C++ project, ever -- the code written for it a year ago when I was learning C++ is/was of much lower quality than code written more recently.
|
||||||
|
+ Code is thus being re-rwitten for clarity/stlye/to de-duplicate functionality, with much being moved into libstratosphere.
|
||||||
|
+ Stratosphere will, after the rewrite, globally use the `sts::` namespace -- this should greatly enhancing libstratosphere's ability to provide functionality for system modules.
|
||||||
|
+ The rewritten modules consistently have lower memory footprints, and should be easier to maintain going forwards.
|
||||||
|
+ The `sm`, `boot`, `spl`, `ro`, and `loader` modules have been tackled so far.
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
|
## 0.9.1
|
||||||
|
+ Support was added for 8.1.0.
|
||||||
|
+ Please note, emummc is still considered **beta/experimental** -- this is not the inevitable bugfix update for it, although some number of bugs have been fixed. :)
|
||||||
|
+ General system stability improvements to enhance the user's experience.
|
||||||
## 0.9.0
|
## 0.9.0
|
||||||
+ Creport output was improved significantly.
|
+ Creport output was improved significantly.
|
||||||
+ Thread names are now dumped on crash in addition to 0x100 of TLS from each thread.
|
+ Thread names are now dumped on crash in addition to 0x100 of TLS from each thread.
|
||||||
@@ -133,7 +294,7 @@
|
|||||||
+ This should greatly simplify the update process in the future, for users who do not launch Atmosphère using fusee.
|
+ This should greatly simplify the update process in the future, for users who do not launch Atmosphère using fusee.
|
||||||
+ Support for cheat codes was added.
|
+ Support for cheat codes was added.
|
||||||
+ These are handled by a new `dmnt` sysmodule, which will also reimplement Nintendo's Debug Monitor in the future.
|
+ These are handled by a new `dmnt` sysmodule, which will also reimplement Nintendo's Debug Monitor in the future.
|
||||||
+ Cheat codes can be enabled/disabled at application launch via a per-title key combination.
|
+ Cheat codes can be enabled/disabled at application launch via a per-title key combination.
|
||||||
+ For details, please see the [cheat loading documentation](https://github.com/Atmosphere-NX/Atmosphere/blob/master/docs/cheats.md#cheat-loating-process).
|
+ For details, please see the [cheat loading documentation](https://github.com/Atmosphere-NX/Atmosphere/blob/master/docs/cheats.md#cheat-loating-process).
|
||||||
+ Cheat codes are fully backwards compatible with the pre-existing format, although a number of bugs have been fixed and some new features have been added.
|
+ Cheat codes are fully backwards compatible with the pre-existing format, although a number of bugs have been fixed and some new features have been added.
|
||||||
+ For details, please see [the compatibility documentation](https://github.com/Atmosphere-NX/Atmosphere/blob/master/docs/cheats.md#cheat-code-compatibility).
|
+ For details, please see [the compatibility documentation](https://github.com/Atmosphere-NX/Atmosphere/blob/master/docs/cheats.md#cheat-code-compatibility).
|
||||||
@@ -206,7 +367,7 @@
|
|||||||
+ This should prevent running FS without `nogc` patches after updating to an unsupported system version.
|
+ This should prevent running FS without `nogc` patches after updating to an unsupported system version.
|
||||||
+ An extension was added to `exosphere` allowing userland applications to cause the system to reboot into RCM:
|
+ An extension was added to `exosphere` allowing userland applications to cause the system to reboot into RCM:
|
||||||
+ This is done by calling smcSetConfig(id=65001, value=<nonzero>); user homebrew can use splSetConfig for this.
|
+ This is done by calling smcSetConfig(id=65001, value=<nonzero>); user homebrew can use splSetConfig for this.
|
||||||
+ On fatal error, the user can now choose to perform a standard reboot via the power button, or a reboot into RCM via either volume button.
|
+ On fatal error, the user can now choose to perform a standard reboot via the power button, or a reboot into RCM via either volume button.
|
||||||
+ A custom message was added to `fatal` for when an Atmosphère API version mismatch is detected (2495-1623).
|
+ A custom message was added to `fatal` for when an Atmosphère API version mismatch is detected (2495-1623).
|
||||||
+ General system stability improvements to enhance the user's experience.
|
+ General system stability improvements to enhance the user's experience.
|
||||||
## 0.8.0
|
## 0.8.0
|
||||||
@@ -249,7 +410,7 @@
|
|||||||
+ Instead of only checking one of the crashing thread's PC/LR for code region presence, creport now checks both + every address in the stacktrace. This is also now done for every thread.
|
+ Instead of only checking one of the crashing thread's PC/LR for code region presence, creport now checks both + every address in the stacktrace. This is also now done for every thread.
|
||||||
+ This matches the improvement Nintendo added to official creport in 6.1.0.
|
+ This matches the improvement Nintendo added to official creport in 6.1.0.
|
||||||
+ The code region detection heuristic was further improved by checking whether an address points to .rodata or .rwdata, instead of just .text.
|
+ The code region detection heuristic was further improved by checking whether an address points to .rodata or .rwdata, instead of just .text.
|
||||||
+ This means that a crash appears in a loaded NRO (or otherwise discontiguous) code region, creport will be able to detect all active code regions, and not just that one.
|
+ This means that a crash appears in a loaded NRO (or otherwise discontiguous) code region, creport will be able to detect all active code regions, and not just that one.
|
||||||
## 0.7.4
|
## 0.7.4
|
||||||
+ [libstratosphere](https://github.com/Atmosphere-NX/libstratosphere) has been completely refactored/rewritten, and split into its own, separate submodule.
|
+ [libstratosphere](https://github.com/Atmosphere-NX/libstratosphere) has been completely refactored/rewritten, and split into its own, separate submodule.
|
||||||
+ While this is mostly "under the hood" for end-users, the refactor is faster (improving both boot-time and runtime performance), more accurate (many of the internal IPC structures are now bug-for-bug compatible with Nintendo's implementations), and significantly more stable (it fixes a large number of bugs present in the old library).
|
+ While this is mostly "under the hood" for end-users, the refactor is faster (improving both boot-time and runtime performance), more accurate (many of the internal IPC structures are now bug-for-bug compatible with Nintendo's implementations), and significantly more stable (it fixes a large number of bugs present in the old library).
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
[subrepo]
|
[subrepo]
|
||||||
remote = https://github.com/m4xw/emuMMC
|
remote = https://github.com/m4xw/emuMMC
|
||||||
branch = develop
|
branch = develop
|
||||||
commit = e72e8f1c8fb7ad8fe7cdedc3784729ea8e11f927
|
commit = bd81a674a946c30b566e1732a95c18f19b701558
|
||||||
parent = 87a1aa17a7693ef39ffea91ad0fa1b530f278bb0
|
parent = 6ee525201ccef107c61d81ba73c891e3eb5f0215
|
||||||
method = rebase
|
method = rebase
|
||||||
cmdver = 0.4.0
|
cmdver = 0.4.0
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ else
|
|||||||
EMUMMCDIR ?= $(CURDIR)/../
|
EMUMMCDIR ?= $(CURDIR)/../
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(EMUMMCDIR)/nx/switch_rules
|
include $(DEVKITPRO)/libnx/switch_rules
|
||||||
|
|
||||||
ARCH := -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE
|
ARCH := -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ CFLAGS += $(INCLUDE) -D__SWITCH__
|
|||||||
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++17
|
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++17
|
||||||
|
|
||||||
ASFLAGS := -g $(ARCH)
|
ASFLAGS := -g $(ARCH)
|
||||||
LDFLAGS = -specs=$(EMUMMCDIR)/nx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
||||||
|
|
||||||
ifneq ($(BUILD),$(notdir $(CURDIR)))
|
ifneq ($(BUILD),$(notdir $(CURDIR)))
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
# emuMMC
|
# emuMMC
|
||||||
*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 - 8.0.1**
|
**1.0.0 - 9.1.0**
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
* Arbitrary SDMMC backend selection
|
* Arbitrary SDMMC backend selection
|
||||||
**This allows loading eMMC from SD or even SD from eMMC**
|
**This allows loading eMMC from SD or even SD from eMMC**
|
||||||
* On the fly hooking / patching, fully self-infesting
|
* On the fly hooking / patching, fully self-infesting
|
||||||
**Only one payload required for all versions!**
|
**Only one payload required for all versions!**
|
||||||
* File-based SDMMC backend support (from SD)
|
* File-based SDMMC backend support (from SD)
|
||||||
**This allows loading eMMC images from hekate-backups (split or not)**
|
**This allows loading eMMC images from hekate-backups (split or not)**
|
||||||
* SDMMC device based sector offset (*currently eMMC only*)
|
* SDMMC device based sector offset (*currently eMMC only*)
|
||||||
**Raw partition support for eMMC from SD with less performance overhead**
|
**Raw partition support for eMMC from SD with less performance overhead**
|
||||||
* Full support for `/Nintendo` folder redirection to a arbitrary path
|
* Full support for `/Nintendo` folder redirection to a arbitrary path
|
||||||
**No 8 char length restriction!**
|
**No 8 char length restriction!**
|
||||||
* exosphere based context configuration
|
* exosphere based context configuration
|
||||||
**This includes full support for multiple emuMMC images**
|
**This includes full support for multiple emuMMC images**
|
||||||
|
|
||||||
## Compiling
|
## Compiling
|
||||||
|
|||||||
@@ -116,6 +116,7 @@
|
|||||||
"svcReplyAndReceive": "0x43",
|
"svcReplyAndReceive": "0x43",
|
||||||
"svcReplyAndReceiveWithUserBuffer": "0x44",
|
"svcReplyAndReceiveWithUserBuffer": "0x44",
|
||||||
"svcCreateEvent": "0x45",
|
"svcCreateEvent": "0x45",
|
||||||
|
"svcReadWriteRegister": "0x4E",
|
||||||
"svcCreateInterruptEvent": "0x53",
|
"svcCreateInterruptEvent": "0x53",
|
||||||
"svcQueryIoMapping": "0x55",
|
"svcQueryIoMapping": "0x55",
|
||||||
"svcCreateDeviceAddressSpace": "0x56",
|
"svcCreateDeviceAddressSpace": "0x56",
|
||||||
|
|||||||
@@ -1,229 +0,0 @@
|
|||||||
OUTPUT_ARCH(aarch64)
|
|
||||||
ENTRY(_start)
|
|
||||||
|
|
||||||
PHDRS
|
|
||||||
{
|
|
||||||
code PT_LOAD FLAGS(5) /* Read | Execute */;
|
|
||||||
rodata PT_LOAD FLAGS(4) /* Read */;
|
|
||||||
data PT_LOAD FLAGS(6) /* Read | Write */;
|
|
||||||
dyn PT_DYNAMIC;
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
/* =========== CODE section =========== */
|
|
||||||
PROVIDE(__start__ = 0x0);
|
|
||||||
. = __start__;
|
|
||||||
__code_start = . ;
|
|
||||||
|
|
||||||
/*.trampoline :
|
|
||||||
{
|
|
||||||
KEEP (*(.trampoline))
|
|
||||||
. = ALIGN(8);
|
|
||||||
} :code
|
|
||||||
|
|
||||||
.emuMMC_ctx :
|
|
||||||
{
|
|
||||||
KEEP (*(.emuMMC_ctx))
|
|
||||||
. = ALIGN(8);
|
|
||||||
} :code */
|
|
||||||
|
|
||||||
.crt0 :
|
|
||||||
{
|
|
||||||
KEEP (*(.crt0))
|
|
||||||
. = ALIGN(8);
|
|
||||||
} :code
|
|
||||||
|
|
||||||
.init :
|
|
||||||
{
|
|
||||||
KEEP( *(.init) )
|
|
||||||
. = ALIGN(8);
|
|
||||||
} :code
|
|
||||||
|
|
||||||
.plt :
|
|
||||||
{
|
|
||||||
*(.plt)
|
|
||||||
*(.iplt)
|
|
||||||
. = ALIGN(8);
|
|
||||||
} :code
|
|
||||||
|
|
||||||
.text :
|
|
||||||
{
|
|
||||||
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
|
|
||||||
*(.text.exit .text.exit.*)
|
|
||||||
*(.text.startup .text.startup.*)
|
|
||||||
*(.text.hot .text.hot.*)
|
|
||||||
*(.text .stub .text.* .gnu.linkonce.t.*)
|
|
||||||
. = ALIGN(8);
|
|
||||||
} :code
|
|
||||||
|
|
||||||
.fini :
|
|
||||||
{
|
|
||||||
KEEP( *(.fini) )
|
|
||||||
. = ALIGN(8);
|
|
||||||
} :code
|
|
||||||
|
|
||||||
/* =========== RODATA section =========== */
|
|
||||||
. = ALIGN(0x1000);
|
|
||||||
__rodata_start = . ;
|
|
||||||
|
|
||||||
.nx-module-name : { KEEP (*(.nx-module-name)) } :rodata
|
|
||||||
|
|
||||||
.rodata :
|
|
||||||
{
|
|
||||||
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
|
||||||
. = ALIGN(8);
|
|
||||||
} :rodata
|
|
||||||
|
|
||||||
.eh_frame_hdr : { __eh_frame_hdr_start = .; *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) __eh_frame_hdr_end = .; } :rodata
|
|
||||||
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) } :rodata
|
|
||||||
.gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } :rodata
|
|
||||||
.gnu_extab : ONLY_IF_RO { *(.gnu_extab*) } : rodata
|
|
||||||
|
|
||||||
.dynamic : { *(.dynamic) } :rodata :dyn
|
|
||||||
.dynsym : { *(.dynsym) } :rodata
|
|
||||||
.dynstr : { *(.dynstr) } :rodata
|
|
||||||
.rela.dyn : { *(.rela.*) } :rodata
|
|
||||||
.interp : { *(.interp) } :rodata
|
|
||||||
.hash : { *(.hash) } :rodata
|
|
||||||
.gnu.hash : { *(.gnu.hash) } :rodata
|
|
||||||
.gnu.version : { *(.gnu.version) } :rodata
|
|
||||||
.gnu.version_d : { *(.gnu.version_d) } :rodata
|
|
||||||
.gnu.version_r : { *(.gnu.version_r) } :rodata
|
|
||||||
.note.gnu.build-id : { *(.note.gnu.build-id) } :rodata
|
|
||||||
|
|
||||||
/* =========== DATA section =========== */
|
|
||||||
. = ALIGN(0x1000);
|
|
||||||
__data_start = . ;
|
|
||||||
|
|
||||||
.eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) } :data
|
|
||||||
.gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } :data
|
|
||||||
.gnu_extab : ONLY_IF_RW { *(.gnu_extab*) } : data
|
|
||||||
.exception_ranges : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) } :data
|
|
||||||
|
|
||||||
.tdata ALIGN(8) :
|
|
||||||
{
|
|
||||||
__tdata_lma = .;
|
|
||||||
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
|
||||||
. = ALIGN(8);
|
|
||||||
__tdata_lma_end = .;
|
|
||||||
} :data
|
|
||||||
|
|
||||||
.tbss ALIGN(8) :
|
|
||||||
{
|
|
||||||
*(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
|
|
||||||
. = ALIGN(8);
|
|
||||||
} :data
|
|
||||||
|
|
||||||
.preinit_array ALIGN(8) :
|
|
||||||
{
|
|
||||||
PROVIDE (__preinit_array_start = .);
|
|
||||||
KEEP (*(.preinit_array))
|
|
||||||
PROVIDE (__preinit_array_end = .);
|
|
||||||
} :data
|
|
||||||
|
|
||||||
.init_array ALIGN(8) :
|
|
||||||
{
|
|
||||||
PROVIDE (__init_array_start = .);
|
|
||||||
KEEP (*(SORT(.init_array.*)))
|
|
||||||
KEEP (*(.init_array))
|
|
||||||
PROVIDE (__init_array_end = .);
|
|
||||||
} :data
|
|
||||||
|
|
||||||
.fini_array ALIGN(8) :
|
|
||||||
{
|
|
||||||
PROVIDE (__fini_array_start = .);
|
|
||||||
KEEP (*(.fini_array))
|
|
||||||
KEEP (*(SORT(.fini_array.*)))
|
|
||||||
PROVIDE (__fini_array_end = .);
|
|
||||||
} :data
|
|
||||||
|
|
||||||
.ctors ALIGN(8) :
|
|
||||||
{
|
|
||||||
KEEP (*crtbegin.o(.ctors)) /* MUST be first -- GCC requires it */
|
|
||||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
|
|
||||||
KEEP (*(SORT(.ctors.*)))
|
|
||||||
KEEP (*(.ctors))
|
|
||||||
} :data
|
|
||||||
|
|
||||||
.dtors ALIGN(8) :
|
|
||||||
{
|
|
||||||
KEEP (*crtbegin.o(.dtors))
|
|
||||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
|
|
||||||
KEEP (*(SORT(.dtors.*)))
|
|
||||||
KEEP (*(.dtors))
|
|
||||||
} :data
|
|
||||||
|
|
||||||
__got_start__ = .;
|
|
||||||
|
|
||||||
.got : { *(.got) *(.igot) } :data
|
|
||||||
.got.plt : { *(.got.plt) *(.igot.plt) } :data
|
|
||||||
|
|
||||||
__got_end__ = .;
|
|
||||||
|
|
||||||
.data ALIGN(8) :
|
|
||||||
{
|
|
||||||
*(.data .data.* .gnu.linkonce.d.*)
|
|
||||||
SORT(CONSTRUCTORS)
|
|
||||||
} :data
|
|
||||||
|
|
||||||
__bss_start__ = .;
|
|
||||||
.bss ALIGN(8) :
|
|
||||||
{
|
|
||||||
*(.dynbss)
|
|
||||||
*(.bss .bss.* .gnu.linkonce.b.*)
|
|
||||||
*(COMMON)
|
|
||||||
. = ALIGN(8);
|
|
||||||
|
|
||||||
/* Reserve space for the TLS segment of the main thread */
|
|
||||||
__tls_start = .;
|
|
||||||
. += + SIZEOF(.tdata) + SIZEOF(.tbss);
|
|
||||||
__tls_end = .;
|
|
||||||
} : data
|
|
||||||
__bss_end__ = .;
|
|
||||||
|
|
||||||
. = ALIGN(0x1000);
|
|
||||||
__end__ = ABSOLUTE(.) ;
|
|
||||||
|
|
||||||
PROVIDE(__injected_size__ = (__end__ - __start__));
|
|
||||||
|
|
||||||
/* ==================
|
|
||||||
==== Metadata ====
|
|
||||||
================== */
|
|
||||||
|
|
||||||
/* Discard sections that difficult post-processing */
|
|
||||||
/DISCARD/ : { *(.group .comment .note) }
|
|
||||||
|
|
||||||
/* Stabs debugging sections. */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
|
|
||||||
/* DWARF debug sections.
|
|
||||||
Symbols in the DWARF debugging sections are relative to the beginning
|
|
||||||
of the section so we begin them at 0. */
|
|
||||||
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
%rename link old_link
|
|
||||||
|
|
||||||
*link:
|
|
||||||
%(old_link) -T %:getenv(PWD /nx/switch.ld) -pie --gc-sections -z text -z nodynamic-undefined-weak --build-id=sha1 --nx-module-name
|
|
||||||
|
|
||||||
*startfile:
|
|
||||||
crti%O%s crtbegin%O%s
|
|
||||||
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
ifeq ($(strip $(DEVKITPRO)),)
|
|
||||||
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitPro)
|
|
||||||
endif
|
|
||||||
|
|
||||||
include $(DEVKITPRO)/devkitA64/base_rules
|
|
||||||
|
|
||||||
PORTLIBS := $(PORTLIBS_PATH)/switch
|
|
||||||
PATH := $(PORTLIBS)/bin:$(PATH)
|
|
||||||
|
|
||||||
LIBNX ?= $(DEVKITPRO)/libnx
|
|
||||||
|
|
||||||
ifeq ($(strip $(APP_TITLE)),)
|
|
||||||
APP_TITLE := $(notdir $(OUTPUT))
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(APP_AUTHOR)),)
|
|
||||||
APP_AUTHOR := Unspecified Author
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(APP_VERSION)),)
|
|
||||||
APP_VERSION := 1.0.0
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(APP_ICON)),)
|
|
||||||
APP_ICON := $(LIBNX)/default_icon.jpg
|
|
||||||
endif
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
|
||||||
%.nacp: $(MAKEFILE_LIST)
|
|
||||||
@nacptool --create "$(APP_TITLE)" "$(APP_AUTHOR)" "$(APP_VERSION)" $@ $(NACPFLAGS)
|
|
||||||
@echo built ... $(notdir $@)
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
|
||||||
%.npdm: $(APP_JSON)
|
|
||||||
@npdmtool $< $@
|
|
||||||
@echo built ... $(notdir $@)
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
|
||||||
define make_pfs0
|
|
||||||
@mkdir -p exefs
|
|
||||||
@[ $(BUILD_EXEFS_SRC) ] && [ -d $(BUILD_EXEFS_SRC) ] && cp -R $(BUILD_EXEFS_SRC)/* exefs || echo > /dev/null
|
|
||||||
@cp $*.nso exefs/main
|
|
||||||
@[ $(APP_JSON) ] && cp $*.npdm exefs/main.npdm || echo > /dev/null
|
|
||||||
@build_pfs0 exefs $@
|
|
||||||
@echo built ... $(notdir $@)
|
|
||||||
endef
|
|
||||||
|
|
||||||
ifeq ($(strip $(APP_JSON)),)
|
|
||||||
%.pfs0: %.nso
|
|
||||||
else
|
|
||||||
%.pfs0: %.nso %.npdm
|
|
||||||
endif
|
|
||||||
$(make_pfs0)
|
|
||||||
|
|
||||||
ifeq ($(strip $(APP_JSON)),)
|
|
||||||
%.nsp: %.nso
|
|
||||||
else
|
|
||||||
%.nsp: %.nso %.npdm
|
|
||||||
endif
|
|
||||||
$(make_pfs0)
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
|
||||||
%.nso: %.elf
|
|
||||||
@elf2nso $< $@
|
|
||||||
@echo built ... $(notdir $@)
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
|
||||||
%.nro: %.elf
|
|
||||||
@elf2nro $< $@ $(NROFLAGS)
|
|
||||||
@echo built ... $(notdir $@)
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
|
||||||
%.kip: %.elf
|
|
||||||
@elf2kip $< $(APP_JSON) $@
|
|
||||||
@echo built ... $(notdir $@)
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
|
||||||
%.elf:
|
|
||||||
@echo linking $(notdir $@)
|
|
||||||
@$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@
|
|
||||||
@$(NM) -CSn $@ > $(notdir $*.lst)
|
|
||||||
@@ -39,29 +39,35 @@
|
|||||||
#include "offsets/700_exfat.h"
|
#include "offsets/700_exfat.h"
|
||||||
#include "offsets/800.h"
|
#include "offsets/800.h"
|
||||||
#include "offsets/800_exfat.h"
|
#include "offsets/800_exfat.h"
|
||||||
|
#include "offsets/810.h"
|
||||||
|
#include "offsets/810_exfat.h"
|
||||||
|
#include "offsets/900.h"
|
||||||
|
#include "offsets/900_exfat.h"
|
||||||
|
#include "offsets/910.h"
|
||||||
|
#include "offsets/910_exfat.h"
|
||||||
#include "../utils/fatal.h"
|
#include "../utils/fatal.h"
|
||||||
|
|
||||||
#define GET_OFFSET_STRUCT_NAME(vers) g_offsets##vers
|
#define GET_OFFSET_STRUCT_NAME(vers) g_offsets##vers
|
||||||
|
|
||||||
#define DEFINE_OFFSET_STRUCT(vers) \
|
#define DEFINE_OFFSET_STRUCT(vers) \
|
||||||
static const fs_offsets_t GET_OFFSET_STRUCT_NAME(vers) = { \
|
static const fs_offsets_t GET_OFFSET_STRUCT_NAME(vers) = { \
|
||||||
.sdmmc_accessor_gc = FS_OFFSET##vers##_SDMMC_ACCESSOR_GC, \
|
.sdmmc_accessor_gc = FS_OFFSET##vers##_SDMMC_ACCESSOR_GC, \
|
||||||
.sdmmc_accessor_sd = FS_OFFSET##vers##_SDMMC_ACCESSOR_SD, \
|
.sdmmc_accessor_sd = FS_OFFSET##vers##_SDMMC_ACCESSOR_SD, \
|
||||||
.sdmmc_accessor_nand = FS_OFFSET##vers##_SDMMC_ACCESSOR_NAND, \
|
.sdmmc_accessor_nand = FS_OFFSET##vers##_SDMMC_ACCESSOR_NAND, \
|
||||||
.sdmmc_wrapper_read = FS_OFFSET##vers##_SDMMC_WRAPPER_READ, \
|
.sdmmc_wrapper_read = FS_OFFSET##vers##_SDMMC_WRAPPER_READ, \
|
||||||
.sdmmc_wrapper_write = FS_OFFSET##vers##_SDMMC_WRAPPER_WRITE, \
|
.sdmmc_wrapper_write = FS_OFFSET##vers##_SDMMC_WRAPPER_WRITE, \
|
||||||
.clkrst_set_min_v_clock_rate = FS_OFFSET##vers##_CLKRST_SET_MIN_V_CLK_RATE, \
|
.clkrst_set_min_v_clock_rate = FS_OFFSET##vers##_CLKRST_SET_MIN_V_CLK_RATE, \
|
||||||
.rtld = FS_OFFSET##vers##_RTLD, \
|
.rtld = FS_OFFSET##vers##_RTLD, \
|
||||||
.rtld_destination = FS_OFFSET##vers##_RTLD_DESTINATION, \
|
.rtld_destination = FS_OFFSET##vers##_RTLD_DESTINATION, \
|
||||||
.lock_mutex = FS_OFFSET##vers##_LOCK_MUTEX, \
|
.lock_mutex = FS_OFFSET##vers##_LOCK_MUTEX, \
|
||||||
.unlock_mutex = FS_OFFSET##vers##_UNLOCK_MUTEX, \
|
.unlock_mutex = FS_OFFSET##vers##_UNLOCK_MUTEX, \
|
||||||
.sd_mutex = FS_OFFSET##vers##_SD_MUTEX, \
|
.sd_mutex = FS_OFFSET##vers##_SD_MUTEX, \
|
||||||
.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, \
|
||||||
.shutdown_sd = FS_OFFSET##vers##_SHUTDOWN_SD, \
|
.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, \
|
||||||
}
|
}
|
||||||
|
|
||||||
// Actually define offset structs
|
// Actually define offset structs
|
||||||
@@ -88,6 +94,12 @@ DEFINE_OFFSET_STRUCT(_700);
|
|||||||
DEFINE_OFFSET_STRUCT(_700_EXFAT);
|
DEFINE_OFFSET_STRUCT(_700_EXFAT);
|
||||||
DEFINE_OFFSET_STRUCT(_800);
|
DEFINE_OFFSET_STRUCT(_800);
|
||||||
DEFINE_OFFSET_STRUCT(_800_EXFAT);
|
DEFINE_OFFSET_STRUCT(_800_EXFAT);
|
||||||
|
DEFINE_OFFSET_STRUCT(_810);
|
||||||
|
DEFINE_OFFSET_STRUCT(_810_EXFAT);
|
||||||
|
DEFINE_OFFSET_STRUCT(_900);
|
||||||
|
DEFINE_OFFSET_STRUCT(_900_EXFAT);
|
||||||
|
DEFINE_OFFSET_STRUCT(_910);
|
||||||
|
DEFINE_OFFSET_STRUCT(_910_EXFAT);
|
||||||
|
|
||||||
const fs_offsets_t *get_fs_offsets(enum FS_VER version) {
|
const fs_offsets_t *get_fs_offsets(enum FS_VER version) {
|
||||||
switch (version) {
|
switch (version) {
|
||||||
@@ -137,6 +149,18 @@ const fs_offsets_t *get_fs_offsets(enum FS_VER version) {
|
|||||||
return &(GET_OFFSET_STRUCT_NAME(_800));
|
return &(GET_OFFSET_STRUCT_NAME(_800));
|
||||||
case FS_VER_8_0_0_EXFAT:
|
case FS_VER_8_0_0_EXFAT:
|
||||||
return &(GET_OFFSET_STRUCT_NAME(_800_EXFAT));
|
return &(GET_OFFSET_STRUCT_NAME(_800_EXFAT));
|
||||||
|
case FS_VER_8_1_0:
|
||||||
|
return &(GET_OFFSET_STRUCT_NAME(_810));
|
||||||
|
case FS_VER_8_1_0_EXFAT:
|
||||||
|
return &(GET_OFFSET_STRUCT_NAME(_810_EXFAT));
|
||||||
|
case FS_VER_9_0_0:
|
||||||
|
return &(GET_OFFSET_STRUCT_NAME(_900));
|
||||||
|
case FS_VER_9_0_0_EXFAT:
|
||||||
|
return &(GET_OFFSET_STRUCT_NAME(_900_EXFAT));
|
||||||
|
case FS_VER_9_1_0:
|
||||||
|
return &(GET_OFFSET_STRUCT_NAME(_910));
|
||||||
|
case FS_VER_9_1_0_EXFAT:
|
||||||
|
return &(GET_OFFSET_STRUCT_NAME(_910_EXFAT));
|
||||||
default:
|
default:
|
||||||
fatal_abort(Fatal_UnknownVersion);
|
fatal_abort(Fatal_UnknownVersion);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
int opcode_reg;
|
int opcode_reg;
|
||||||
uint32_t adrp_offset;
|
uint32_t adrp_offset;
|
||||||
|
uint32_t add_rel_offset;
|
||||||
} fs_offsets_nintendo_path_t;
|
} fs_offsets_nintendo_path_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -40,13 +41,13 @@ 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_close;
|
||||||
// Misc data
|
// Misc data
|
||||||
uintptr_t sd_mutex;
|
uintptr_t sd_mutex;
|
||||||
uintptr_t nand_mutex;
|
uintptr_t nand_mutex;
|
||||||
uintptr_t active_partition;
|
uintptr_t active_partition;
|
||||||
uintptr_t sdmmc_das_handle;
|
uintptr_t sdmmc_das_handle;
|
||||||
// NOPs
|
// NOPs
|
||||||
uintptr_t shutdown_sd;
|
|
||||||
uintptr_t sd_das_init;
|
uintptr_t sd_das_init;
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
fs_offsets_nintendo_path_t nintendo_paths[];
|
fs_offsets_nintendo_path_t nintendo_paths[];
|
||||||
|
|||||||
@@ -20,7 +20,8 @@
|
|||||||
|
|
||||||
#include "../utils/types.h"
|
#include "../utils/types.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
char *device_addr_buffer;
|
char *device_addr_buffer;
|
||||||
uint64_t device_addr_buffer_size;
|
uint64_t device_addr_buffer_size;
|
||||||
char *device_addr_buffer_masked;
|
char *device_addr_buffer_masked;
|
||||||
@@ -28,25 +29,30 @@ typedef struct {
|
|||||||
|
|
||||||
_Static_assert(__alignof(sdmmc_dma_buffer_t) == 8, "sdmmc_dma_buffer_t definition");
|
_Static_assert(__alignof(sdmmc_dma_buffer_t) == 8, "sdmmc_dma_buffer_t definition");
|
||||||
|
|
||||||
typedef struct sdmmc_accessor_vt {
|
typedef struct sdmmc_accessor_vt
|
||||||
|
{
|
||||||
void *ctor;
|
void *ctor;
|
||||||
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;
|
void *controller_open;
|
||||||
void *controller_close;
|
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.
|
||||||
} sdmmc_accessor_vt_t;
|
} sdmmc_accessor_vt_t;
|
||||||
|
|
||||||
typedef struct {
|
_Static_assert(__alignof(sdmmc_accessor_vt_t) == 8, "sdmmc_accessor_vt_t definition");
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
void *vtab;
|
void *vtab;
|
||||||
t210_sdmmc_t *io_map;
|
t210_sdmmc_t *io_map;
|
||||||
sdmmc_dma_buffer_t dmaBuffers[3];
|
sdmmc_dma_buffer_t dmaBuffers[3];
|
||||||
// More not included because we don't use it.
|
// More not included because we don't use it.
|
||||||
} mmc_obj_t;
|
} mmc_obj_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
sdmmc_accessor_vt_t *vtab;
|
sdmmc_accessor_vt_t *vtab;
|
||||||
mmc_obj_t *parent;
|
mmc_obj_t *parent;
|
||||||
// More not included because we don't use it.
|
// More not included because we don't use it.
|
||||||
|
|||||||
@@ -56,6 +56,15 @@ enum FS_VER
|
|||||||
FS_VER_8_0_0,
|
FS_VER_8_0_0,
|
||||||
FS_VER_8_0_0_EXFAT,
|
FS_VER_8_0_0_EXFAT,
|
||||||
|
|
||||||
|
FS_VER_8_1_0,
|
||||||
|
FS_VER_8_1_0_EXFAT,
|
||||||
|
|
||||||
|
FS_VER_9_0_0,
|
||||||
|
FS_VER_9_0_0_EXFAT,
|
||||||
|
|
||||||
|
FS_VER_9_1_0,
|
||||||
|
FS_VER_9_1_0_EXFAT,
|
||||||
|
|
||||||
FS_VER_MAX,
|
FS_VER_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x6A8AC
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_100_SD_MUTEX 0xE36058
|
#define FS_OFFSET_100_SD_MUTEX 0xE36058
|
||||||
#define FS_OFFSET_100_NAND_MUTEX 0xE30610
|
#define FS_OFFSET_100_NAND_MUTEX 0xE30610
|
||||||
@@ -41,17 +43,16 @@
|
|||||||
#define FS_OFFSET_100_SDMMC_DAS_HANDLE 0xE2F730
|
#define FS_OFFSET_100_SDMMC_DAS_HANDLE 0xE2F730
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_100_SHUTDOWN_SD 0x22548
|
|
||||||
#define FS_OFFSET_100_SD_DAS_INIT 0x0
|
#define FS_OFFSET_100_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_100_NINTENDO_PATHS \
|
#define FS_OFFSET_100_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 9, .adrp_offset = 0x00032C58}, \
|
{.opcode_reg = 9, .adrp_offset = 0x00032C58, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 8, .adrp_offset = 0x00032C60}, \
|
{.opcode_reg = 8, .adrp_offset = 0x00032C60, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 9, .adrp_offset = 0x00032F3C}, \
|
{.opcode_reg = 9, .adrp_offset = 0x00032F3C, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 8, .adrp_offset = 0x00032F44}, \
|
{.opcode_reg = 8, .adrp_offset = 0x00032F44, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_100_H__
|
#endif // __FS_100_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x733F4
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_200_SD_MUTEX 0xE42268
|
#define FS_OFFSET_200_SD_MUTEX 0xE42268
|
||||||
#define FS_OFFSET_200_NAND_MUTEX 0xE3CED0
|
#define FS_OFFSET_200_NAND_MUTEX 0xE3CED0
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_200_SDMMC_DAS_HANDLE 0xE3BDD0
|
#define FS_OFFSET_200_SDMMC_DAS_HANDLE 0xE3BDD0
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_200_SHUTDOWN_SD 0x20C48
|
|
||||||
#define FS_OFFSET_200_SD_DAS_INIT 0x0
|
#define FS_OFFSET_200_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_200_NINTENDO_PATHS \
|
#define FS_OFFSET_200_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00033F08}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00033F08, .add_rel_offset = 0x00000004}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00035084}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00035084, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0003537C}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0003537C, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_200_H__
|
#endif // __FS_200_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x733F4
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_200_EXFAT_SD_MUTEX 0xF22268
|
#define FS_OFFSET_200_EXFAT_SD_MUTEX 0xF22268
|
||||||
#define FS_OFFSET_200_EXFAT_NAND_MUTEX 0xF1CED0
|
#define FS_OFFSET_200_EXFAT_NAND_MUTEX 0xF1CED0
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_200_EXFAT_SDMMC_DAS_HANDLE 0xF1BDD0
|
#define FS_OFFSET_200_EXFAT_SDMMC_DAS_HANDLE 0xF1BDD0
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_200_EXFAT_SHUTDOWN_SD 0x20C48
|
|
||||||
#define FS_OFFSET_200_EXFAT_SD_DAS_INIT 0x0
|
#define FS_OFFSET_200_EXFAT_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_200_EXFAT_NINTENDO_PATHS \
|
#define FS_OFFSET_200_EXFAT_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00033F08}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00033F08, .add_rel_offset = 0x00000004}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00035084}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00035084, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0003537C}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0003537C, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_200_EXFAT_H__
|
#endif // __FS_200_EXFAT_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x737D4
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_210_SD_MUTEX 0xE43268
|
#define FS_OFFSET_210_SD_MUTEX 0xE43268
|
||||||
#define FS_OFFSET_210_NAND_MUTEX 0xE3DED0
|
#define FS_OFFSET_210_NAND_MUTEX 0xE3DED0
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_210_SDMMC_DAS_HANDLE 0xE3CDD0
|
#define FS_OFFSET_210_SDMMC_DAS_HANDLE 0xE3CDD0
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_210_SHUTDOWN_SD 0x20E60
|
|
||||||
#define FS_OFFSET_210_SD_DAS_INIT 0x0
|
#define FS_OFFSET_210_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_210_NINTENDO_PATHS \
|
#define FS_OFFSET_210_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x000342E0}, \
|
{.opcode_reg = 3, .adrp_offset = 0x000342E0, .add_rel_offset = 0x00000004}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0003545C}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0003545C, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00035754}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00035754, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_210_H__
|
#endif // __FS_210_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x737D4
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_210_EXFAT_SD_MUTEX 0xF22268
|
#define FS_OFFSET_210_EXFAT_SD_MUTEX 0xF22268
|
||||||
#define FS_OFFSET_210_EXFAT_NAND_MUTEX 0xF1CED0
|
#define FS_OFFSET_210_EXFAT_NAND_MUTEX 0xF1CED0
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_210_EXFAT_SDMMC_DAS_HANDLE 0xF1BDD0
|
#define FS_OFFSET_210_EXFAT_SDMMC_DAS_HANDLE 0xF1BDD0
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_210_EXFAT_SHUTDOWN_SD 0x20E60
|
|
||||||
#define FS_OFFSET_210_EXFAT_SD_DAS_INIT 0x0
|
#define FS_OFFSET_210_EXFAT_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_210_EXFAT_NINTENDO_PATHS \
|
#define FS_OFFSET_210_EXFAT_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x000342E0}, \
|
{.opcode_reg = 3, .adrp_offset = 0x000342E0, .add_rel_offset = 0x00000004}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0003545C}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0003545C, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00035754}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00035754, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_210_EXFAT_H__
|
#endif // __FS_210_EXFAT_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x8A270
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_300_SD_MUTEX 0xE69268
|
#define FS_OFFSET_300_SD_MUTEX 0xE69268
|
||||||
#define FS_OFFSET_300_NAND_MUTEX 0xE646F0
|
#define FS_OFFSET_300_NAND_MUTEX 0xE646F0
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_300_SDMMC_DAS_HANDLE 0xE635A0
|
#define FS_OFFSET_300_SDMMC_DAS_HANDLE 0xE635A0
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_300_SHUTDOWN_SD 0x258D8
|
|
||||||
#define FS_OFFSET_300_SD_DAS_INIT 0x0
|
#define FS_OFFSET_300_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_300_NINTENDO_PATHS \
|
#define FS_OFFSET_300_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x000391F4}, \
|
{.opcode_reg = 3, .adrp_offset = 0x000391F4, .add_rel_offset = 0x00000004}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0003A480}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0003A480, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0003A778}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0003A778, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_300_H__
|
#endif // __FS_300_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x8A270
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_300_EXFAT_SD_MUTEX 0xF4C268
|
#define FS_OFFSET_300_EXFAT_SD_MUTEX 0xF4C268
|
||||||
#define FS_OFFSET_300_EXFAT_NAND_MUTEX 0xF476F0
|
#define FS_OFFSET_300_EXFAT_NAND_MUTEX 0xF476F0
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_300_EXFAT_SDMMC_DAS_HANDLE 0xF465A0
|
#define FS_OFFSET_300_EXFAT_SDMMC_DAS_HANDLE 0xF465A0
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_300_EXFAT_SHUTDOWN_SD 0x258D8
|
|
||||||
#define FS_OFFSET_300_EXFAT_SD_DAS_INIT 0x0
|
#define FS_OFFSET_300_EXFAT_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_300_EXFAT_NINTENDO_PATHS \
|
#define FS_OFFSET_300_EXFAT_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x000391F4}, \
|
{.opcode_reg = 3, .adrp_offset = 0x000391F4, .add_rel_offset = 0x00000004}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0003A480}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0003A480, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0003A778}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0003A778, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_300_EXFAT_H__
|
#endif // __FS_300_EXFAT_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x8A32C
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_301_SD_MUTEX 0xE69268
|
#define FS_OFFSET_301_SD_MUTEX 0xE69268
|
||||||
#define FS_OFFSET_301_NAND_MUTEX 0xE646F0
|
#define FS_OFFSET_301_NAND_MUTEX 0xE646F0
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_301_SDMMC_DAS_HANDLE 0xE635A0
|
#define FS_OFFSET_301_SDMMC_DAS_HANDLE 0xE635A0
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_301_SHUTDOWN_SD 0x25944
|
|
||||||
#define FS_OFFSET_301_SD_DAS_INIT 0x0
|
#define FS_OFFSET_301_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_301_NINTENDO_PATHS \
|
#define FS_OFFSET_301_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00039260}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00039260, .add_rel_offset = 0x00000004}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0003A4EC}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0003A4EC, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0003A7E4}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0003A7E4, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_301_H__
|
#endif // __FS_301_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x8A32C
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_301_EXFAT_SD_MUTEX 0xF4C268
|
#define FS_OFFSET_301_EXFAT_SD_MUTEX 0xF4C268
|
||||||
#define FS_OFFSET_301_EXFAT_NAND_MUTEX 0xF476F0
|
#define FS_OFFSET_301_EXFAT_NAND_MUTEX 0xF476F0
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_301_EXFAT_SDMMC_DAS_HANDLE 0xF465A0
|
#define FS_OFFSET_301_EXFAT_SDMMC_DAS_HANDLE 0xF465A0
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_301_EXFAT_SHUTDOWN_SD 0x25944
|
|
||||||
#define FS_OFFSET_301_EXFAT_SD_DAS_INIT 0x0
|
#define FS_OFFSET_301_EXFAT_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_301_EXFAT_NINTENDO_PATHS \
|
#define FS_OFFSET_301_EXFAT_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00039260}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00039260, .add_rel_offset = 0x00000004}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0003A4EC}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0003A4EC, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0003A7E4}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0003A7E4, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_301_EXFAT_H__
|
#endif // __FS_301_EXFAT_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x9DB48
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_400_SD_MUTEX 0xE80268
|
#define FS_OFFSET_400_SD_MUTEX 0xE80268
|
||||||
#define FS_OFFSET_400_NAND_MUTEX 0xE7BC60
|
#define FS_OFFSET_400_NAND_MUTEX 0xE7BC60
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_400_SDMMC_DAS_HANDLE 0xE7ABF0
|
#define FS_OFFSET_400_SDMMC_DAS_HANDLE 0xE7ABF0
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_400_SHUTDOWN_SD 0x32D70
|
|
||||||
#define FS_OFFSET_400_SD_DAS_INIT 0x0
|
#define FS_OFFSET_400_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_400_NINTENDO_PATHS \
|
#define FS_OFFSET_400_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0002023C}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0002023C, .add_rel_offset = 0x00000004}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00021BE8}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00021BE8, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00021EC4}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00021EC4, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_400_H__
|
#endif // __FS_400_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x9DB48
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_400_EXFAT_SD_MUTEX 0xF63268
|
#define FS_OFFSET_400_EXFAT_SD_MUTEX 0xF63268
|
||||||
#define FS_OFFSET_400_EXFAT_NAND_MUTEX 0xF5EC60
|
#define FS_OFFSET_400_EXFAT_NAND_MUTEX 0xF5EC60
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_400_EXFAT_SDMMC_DAS_HANDLE 0xF5DBF0
|
#define FS_OFFSET_400_EXFAT_SDMMC_DAS_HANDLE 0xF5DBF0
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_400_EXFAT_SHUTDOWN_SD 0x32D70
|
|
||||||
#define FS_OFFSET_400_EXFAT_SD_DAS_INIT 0x0
|
#define FS_OFFSET_400_EXFAT_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_400_EXFAT_NINTENDO_PATHS \
|
#define FS_OFFSET_400_EXFAT_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0002023C}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0002023C, .add_rel_offset = 0x00000004}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00021BE8}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00021BE8, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00021EC4}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00021EC4, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_400_EXFAT_H__
|
#endif // __FS_400_EXFAT_H__
|
||||||
|
|||||||
@@ -34,6 +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
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_410_SD_MUTEX 0xE80268
|
#define FS_OFFSET_410_SD_MUTEX 0xE80268
|
||||||
#define FS_OFFSET_410_NAND_MUTEX 0xE7BC60
|
#define FS_OFFSET_410_NAND_MUTEX 0xE7BC60
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_410_SDMMC_DAS_HANDLE 0xE7ABF0
|
#define FS_OFFSET_410_SDMMC_DAS_HANDLE 0xE7ABF0
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_410_SHUTDOWN_SD 0x32D70
|
|
||||||
#define FS_OFFSET_410_SD_DAS_INIT 0x0
|
#define FS_OFFSET_410_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_410_NINTENDO_PATHS \
|
#define FS_OFFSET_410_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0002023C}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0002023C, .add_rel_offset = 0x00000004}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00021BE8}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00021BE8, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00021EC4}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00021EC4, .add_rel_offset = 0x0000000C}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_410_H__
|
#endif // __FS_410_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x9DBAC
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_410_EXFAT_SD_MUTEX 0xF63268
|
#define FS_OFFSET_410_EXFAT_SD_MUTEX 0xF63268
|
||||||
#define FS_OFFSET_410_EXFAT_NAND_MUTEX 0xF5EC60
|
#define FS_OFFSET_410_EXFAT_NAND_MUTEX 0xF5EC60
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_410_EXFAT_SDMMC_DAS_HANDLE 0xF5DBF0
|
#define FS_OFFSET_410_EXFAT_SDMMC_DAS_HANDLE 0xF5DBF0
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_410_EXFAT_SHUTDOWN_SD 0x32D70
|
|
||||||
#define FS_OFFSET_410_EXFAT_SD_DAS_INIT 0x0
|
#define FS_OFFSET_410_EXFAT_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_410_EXFAT_NINTENDO_PATHS \
|
#define FS_OFFSET_410_EXFAT_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0002023C}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0002023C, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00021BE8}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00021BE8, .add_rel_offset = 12}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00021EC4}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00021EC4, .add_rel_offset = 12}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_410_EXFAT_H__
|
#endif // __FS_410_EXFAT_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0xC9380
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_500_SD_MUTEX 0xEC3268
|
#define FS_OFFSET_500_SD_MUTEX 0xEC3268
|
||||||
#define FS_OFFSET_500_NAND_MUTEX 0xEBDE58
|
#define FS_OFFSET_500_NAND_MUTEX 0xEBDE58
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_500_SDMMC_DAS_HANDLE 0xEBCE30
|
#define FS_OFFSET_500_SDMMC_DAS_HANDLE 0xEBCE30
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_500_SHUTDOWN_SD 0x443E8
|
|
||||||
#define FS_OFFSET_500_SD_DAS_INIT 0x0
|
#define FS_OFFSET_500_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_500_NINTENDO_PATHS \
|
#define FS_OFFSET_500_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00028980}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00028980, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0002ACE4}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0002ACE4, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0002B220}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0002B220, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_500_H__
|
#endif // __FS_500_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0xC9380
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_500_EXFAT_SD_MUTEX 0xFA8268
|
#define FS_OFFSET_500_EXFAT_SD_MUTEX 0xFA8268
|
||||||
#define FS_OFFSET_500_EXFAT_NAND_MUTEX 0xFA2E58
|
#define FS_OFFSET_500_EXFAT_NAND_MUTEX 0xFA2E58
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_500_EXFAT_SDMMC_DAS_HANDLE 0xFA1E30
|
#define FS_OFFSET_500_EXFAT_SDMMC_DAS_HANDLE 0xFA1E30
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_500_EXFAT_SHUTDOWN_SD 0x443E8
|
|
||||||
#define FS_OFFSET_500_EXFAT_SD_DAS_INIT 0x0
|
#define FS_OFFSET_500_EXFAT_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_500_EXFAT_NINTENDO_PATHS \
|
#define FS_OFFSET_500_EXFAT_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00028980}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00028980, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0002ACE4}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0002ACE4, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0002B220}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0002B220, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_500_EXFAT_H__
|
#endif // __FS_500_EXFAT_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0xC9750
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_510_SD_MUTEX 0xEC4268
|
#define FS_OFFSET_510_SD_MUTEX 0xEC4268
|
||||||
#define FS_OFFSET_510_NAND_MUTEX 0xEBEE58
|
#define FS_OFFSET_510_NAND_MUTEX 0xEBEE58
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_510_SDMMC_DAS_HANDLE 0xEBDE30
|
#define FS_OFFSET_510_SDMMC_DAS_HANDLE 0xEBDE30
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_510_SHUTDOWN_SD 0x44578
|
|
||||||
#define FS_OFFSET_510_SD_DAS_INIT 0x0
|
#define FS_OFFSET_510_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_510_NINTENDO_PATHS \
|
#define FS_OFFSET_510_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x000289B0}, \
|
{.opcode_reg = 3, .adrp_offset = 0x000289B0, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0002AD14}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0002AD14, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0002B250}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0002B250, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_510_H__
|
#endif // __FS_510_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0xC9750
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_510_EXFAT_SD_MUTEX 0xFA9268
|
#define FS_OFFSET_510_EXFAT_SD_MUTEX 0xFA9268
|
||||||
#define FS_OFFSET_510_EXFAT_NAND_MUTEX 0xFA3E58
|
#define FS_OFFSET_510_EXFAT_NAND_MUTEX 0xFA3E58
|
||||||
@@ -41,16 +43,15 @@
|
|||||||
#define FS_OFFSET_510_EXFAT_SDMMC_DAS_HANDLE 0xFA2E30
|
#define FS_OFFSET_510_EXFAT_SDMMC_DAS_HANDLE 0xFA2E30
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_510_EXFAT_SHUTDOWN_SD 0x44578
|
|
||||||
#define FS_OFFSET_510_EXFAT_SD_DAS_INIT 0x0
|
#define FS_OFFSET_510_EXFAT_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_510_EXFAT_NINTENDO_PATHS \
|
#define FS_OFFSET_510_EXFAT_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x000289B0}, \
|
{.opcode_reg = 3, .adrp_offset = 0x000289B0, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0002AD14}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0002AD14, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0002B250}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0002B250, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_510_EXFAT_H__
|
#endif // __FS_510_EXFAT_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x148500
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_600_SD_MUTEX 0xF06268
|
#define FS_OFFSET_600_SD_MUTEX 0xF06268
|
||||||
#define FS_OFFSET_600_NAND_MUTEX 0xF01BA0
|
#define FS_OFFSET_600_NAND_MUTEX 0xF01BA0
|
||||||
@@ -41,17 +43,16 @@
|
|||||||
#define FS_OFFSET_600_SDMMC_DAS_HANDLE 0xE01670
|
#define FS_OFFSET_600_SDMMC_DAS_HANDLE 0xE01670
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_600_SHUTDOWN_SD 0xB2F28
|
|
||||||
#define FS_OFFSET_600_SD_DAS_INIT 0x0
|
#define FS_OFFSET_600_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_600_NINTENDO_PATHS \
|
#define FS_OFFSET_600_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x000790DC}, \
|
{.opcode_reg = 3, .adrp_offset = 0x000790DC, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0007A924}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0007A924, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0007AB18}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0007AB18, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0007AEF4}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0007AEF4, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0} \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_600_H__
|
#endif // __FS_600_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x153C00
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_600_EXFAT_SD_MUTEX 0xFEB268
|
#define FS_OFFSET_600_EXFAT_SD_MUTEX 0xFEB268
|
||||||
#define FS_OFFSET_600_EXFAT_NAND_MUTEX 0xFE6BA0
|
#define FS_OFFSET_600_EXFAT_NAND_MUTEX 0xFE6BA0
|
||||||
@@ -41,17 +43,16 @@
|
|||||||
#define FS_OFFSET_600_EXFAT_SDMMC_DAS_HANDLE 0xEE6670
|
#define FS_OFFSET_600_EXFAT_SDMMC_DAS_HANDLE 0xEE6670
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_600_EXFAT_SHUTDOWN_SD 0xBE628
|
|
||||||
#define FS_OFFSET_600_EXFAT_SD_DAS_INIT 0x0
|
#define FS_OFFSET_600_EXFAT_SD_DAS_INIT 0x0
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_600_EXFAT_NINTENDO_PATHS \
|
#define FS_OFFSET_600_EXFAT_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x000847DC}, \
|
{.opcode_reg = 3, .adrp_offset = 0x000847DC, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00086024}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00086024, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00086218}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00086218, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x000865F4}, \
|
{.opcode_reg = 3, .adrp_offset = 0x000865F4, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0} \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_600_EXFAT_H__
|
#endif // __FS_600_EXFAT_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x14FD50
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_700_SD_MUTEX 0xF123E8
|
#define FS_OFFSET_700_SD_MUTEX 0xF123E8
|
||||||
#define FS_OFFSET_700_NAND_MUTEX 0xF0DBE8
|
#define FS_OFFSET_700_NAND_MUTEX 0xF0DBE8
|
||||||
@@ -41,18 +43,17 @@
|
|||||||
#define FS_OFFSET_700_SDMMC_DAS_HANDLE 0xE0E7A0
|
#define FS_OFFSET_700_SDMMC_DAS_HANDLE 0xE0E7A0
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_700_SHUTDOWN_SD 0xB8FCC
|
|
||||||
#define FS_OFFSET_700_SD_DAS_INIT 0x85FE8
|
#define FS_OFFSET_700_SD_DAS_INIT 0x85FE8
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_700_NINTENDO_PATHS \
|
#define FS_OFFSET_700_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0007DA90}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0007DA90, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0007F344}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0007F344, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0007F538}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0007F538, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0007F914}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0007F914, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 4, .adrp_offset = 0x0007FAD8}, \
|
{.opcode_reg = 4, .adrp_offset = 0x0007FAD8, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_700_H__
|
#endif // __FS_700_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x15B300
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_700_EXFAT_SD_MUTEX 0xFF73E8
|
#define FS_OFFSET_700_EXFAT_SD_MUTEX 0xFF73E8
|
||||||
#define FS_OFFSET_700_EXFAT_NAND_MUTEX 0xFF2BE8
|
#define FS_OFFSET_700_EXFAT_NAND_MUTEX 0xFF2BE8
|
||||||
@@ -41,18 +43,17 @@
|
|||||||
#define FS_OFFSET_700_EXFAT_SDMMC_DAS_HANDLE 0xEF3A00
|
#define FS_OFFSET_700_EXFAT_SDMMC_DAS_HANDLE 0xEF3A00
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_700_EXFAT_SHUTDOWN_SD 0xC457C
|
|
||||||
#define FS_OFFSET_700_EXFAT_SD_DAS_INIT 0x91598
|
#define FS_OFFSET_700_EXFAT_SD_DAS_INIT 0x91598
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_700_EXFAT_NINTENDO_PATHS \
|
#define FS_OFFSET_700_EXFAT_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00089040}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00089040, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0008A8F4}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0008A8F4, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0008AAE8}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0008AAE8, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0008AEC4}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0008AEC4, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 4, .adrp_offset = 0x0008B088}, \
|
{.opcode_reg = 4, .adrp_offset = 0x0008B088, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0}, \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_700_EXFAT_H__
|
#endif // __FS_700_EXFAT_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x1529E0
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_800_SD_MUTEX 0xF1A3E8
|
#define FS_OFFSET_800_SD_MUTEX 0xF1A3E8
|
||||||
#define FS_OFFSET_800_NAND_MUTEX 0xF15BE8
|
#define FS_OFFSET_800_NAND_MUTEX 0xF15BE8
|
||||||
@@ -41,18 +43,17 @@
|
|||||||
#define FS_OFFSET_800_SDMMC_DAS_HANDLE 0xE167C0
|
#define FS_OFFSET_800_SDMMC_DAS_HANDLE 0xE167C0
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_800_SHUTDOWN_SD 0xBAF6C
|
|
||||||
#define FS_OFFSET_800_SD_DAS_INIT 0x87D58
|
#define FS_OFFSET_800_SD_DAS_INIT 0x87D58
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_800_NINTENDO_PATHS \
|
#define FS_OFFSET_800_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0007F5F0}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0007F5F0, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00081084}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00081084, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00081278}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00081278, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x00081654}, \
|
{.opcode_reg = 3, .adrp_offset = 0x00081654, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 4, .adrp_offset = 0x00081818}, \
|
{.opcode_reg = 4, .adrp_offset = 0x00081818, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0} \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_800_H__
|
#endif // __FS_800_H__
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#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_CLOSE 0x15DF90
|
||||||
|
|
||||||
// Misc Data
|
// Misc Data
|
||||||
#define FS_OFFSET_800_EXFAT_SD_MUTEX 0xFFE3E8
|
#define FS_OFFSET_800_EXFAT_SD_MUTEX 0xFFE3E8
|
||||||
#define FS_OFFSET_800_EXFAT_NAND_MUTEX 0xFF9BE8
|
#define FS_OFFSET_800_EXFAT_NAND_MUTEX 0xFF9BE8
|
||||||
@@ -41,18 +43,17 @@
|
|||||||
#define FS_OFFSET_800_EXFAT_SDMMC_DAS_HANDLE 0xEFAA20
|
#define FS_OFFSET_800_EXFAT_SDMMC_DAS_HANDLE 0xEFAA20
|
||||||
|
|
||||||
// NOPs
|
// NOPs
|
||||||
#define FS_OFFSET_800_EXFAT_SHUTDOWN_SD 0xC651C
|
|
||||||
#define FS_OFFSET_800_EXFAT_SD_DAS_INIT 0x93308
|
#define FS_OFFSET_800_EXFAT_SD_DAS_INIT 0x93308
|
||||||
|
|
||||||
// Nintendo Paths
|
// Nintendo Paths
|
||||||
#define FS_OFFSET_800_EXFAT_NINTENDO_PATHS \
|
#define FS_OFFSET_800_EXFAT_NINTENDO_PATHS \
|
||||||
{ \
|
{ \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0008ABA0}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0008ABA0, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0008C634}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0008C634, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0008C828}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0008C828, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 3, .adrp_offset = 0x0008CC04}, \
|
{.opcode_reg = 3, .adrp_offset = 0x0008CC04, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 4, .adrp_offset = 0x0008CDC8}, \
|
{.opcode_reg = 4, .adrp_offset = 0x0008CDC8, .add_rel_offset = 4}, \
|
||||||
{.opcode_reg = 0, .adrp_offset = 0} \
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __FS_800_EXFAT_H__
|
#endif // __FS_800_EXFAT_H__
|
||||||
|
|||||||
59
emummc/source/FS/offsets/810.h
Normal file
59
emummc/source/FS/offsets/810.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 m4xw <m4x@m4xw.net>
|
||||||
|
* Copyright (c) 2019 Atmosphere-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/>.
|
||||||
|
*/
|
||||||
|
#ifndef __FS_810_H__
|
||||||
|
#define __FS_810_H__
|
||||||
|
|
||||||
|
// Accessor vtable getters
|
||||||
|
#define FS_OFFSET_810_SDMMC_ACCESSOR_GC 0x15EA20
|
||||||
|
#define FS_OFFSET_810_SDMMC_ACCESSOR_SD 0x15E790
|
||||||
|
#define FS_OFFSET_810_SDMMC_ACCESSOR_NAND 0x15AC80
|
||||||
|
|
||||||
|
// Hooks
|
||||||
|
#define FS_OFFSET_810_SDMMC_WRAPPER_READ 0x152A80
|
||||||
|
#define FS_OFFSET_810_SDMMC_WRAPPER_WRITE 0x152B60
|
||||||
|
#define FS_OFFSET_810_RTLD 0x5B4
|
||||||
|
#define FS_OFFSET_810_RTLD_DESTINATION 0x9C
|
||||||
|
|
||||||
|
#define FS_OFFSET_810_CLKRST_SET_MIN_V_CLK_RATE 0x16F370
|
||||||
|
|
||||||
|
// Misc funcs
|
||||||
|
#define FS_OFFSET_810_LOCK_MUTEX 0x14B6D0
|
||||||
|
#define FS_OFFSET_810_UNLOCK_MUTEX 0x14B720
|
||||||
|
|
||||||
|
#define FS_OFFSET_810_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1529E0
|
||||||
|
|
||||||
|
// Misc Data
|
||||||
|
#define FS_OFFSET_810_SD_MUTEX 0xF1A3E8
|
||||||
|
#define FS_OFFSET_810_NAND_MUTEX 0xF15BE8
|
||||||
|
#define FS_OFFSET_810_ACTIVE_PARTITION 0xF15C28
|
||||||
|
#define FS_OFFSET_810_SDMMC_DAS_HANDLE 0xE167C0
|
||||||
|
|
||||||
|
// NOPs
|
||||||
|
#define FS_OFFSET_810_SD_DAS_INIT 0x87D58
|
||||||
|
|
||||||
|
// Nintendo Paths
|
||||||
|
#define FS_OFFSET_810_NINTENDO_PATHS \
|
||||||
|
{ \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0007F5F0, .add_rel_offset = 4}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00081084, .add_rel_offset = 4}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00081278, .add_rel_offset = 4}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00081654, .add_rel_offset = 4}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x00081818, .add_rel_offset = 4}, \
|
||||||
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __FS_810_H__
|
||||||
59
emummc/source/FS/offsets/810_exfat.h
Normal file
59
emummc/source/FS/offsets/810_exfat.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 m4xw <m4x@m4xw.net>
|
||||||
|
* Copyright (c) 2019 Atmosphere-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/>.
|
||||||
|
*/
|
||||||
|
#ifndef __FS_810_EXFAT_H__
|
||||||
|
#define __FS_810_EXFAT_H__
|
||||||
|
|
||||||
|
// Accessor vtable getters
|
||||||
|
#define FS_OFFSET_810_EXFAT_SDMMC_ACCESSOR_GC 0x169FD0
|
||||||
|
#define FS_OFFSET_810_EXFAT_SDMMC_ACCESSOR_SD 0x169D40
|
||||||
|
#define FS_OFFSET_810_EXFAT_SDMMC_ACCESSOR_NAND 0x166230
|
||||||
|
|
||||||
|
// Hooks
|
||||||
|
#define FS_OFFSET_810_EXFAT_SDMMC_WRAPPER_READ 0x15E030
|
||||||
|
#define FS_OFFSET_810_EXFAT_SDMMC_WRAPPER_WRITE 0x15E110
|
||||||
|
#define FS_OFFSET_810_EXFAT_RTLD 0x5B4
|
||||||
|
#define FS_OFFSET_810_EXFAT_RTLD_DESTINATION 0x9C
|
||||||
|
|
||||||
|
#define FS_OFFSET_810_EXFAT_CLKRST_SET_MIN_V_CLK_RATE 0x17A920
|
||||||
|
|
||||||
|
// Misc funcs
|
||||||
|
#define FS_OFFSET_810_EXFAT_LOCK_MUTEX 0x156C80
|
||||||
|
#define FS_OFFSET_810_EXFAT_UNLOCK_MUTEX 0x156CD0
|
||||||
|
|
||||||
|
#define FS_OFFSET_810_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x15DF90
|
||||||
|
|
||||||
|
// Misc Data
|
||||||
|
#define FS_OFFSET_810_EXFAT_SD_MUTEX 0xFFE3E8
|
||||||
|
#define FS_OFFSET_810_EXFAT_NAND_MUTEX 0xFF9BE8
|
||||||
|
#define FS_OFFSET_810_EXFAT_ACTIVE_PARTITION 0xFF9C28
|
||||||
|
#define FS_OFFSET_810_EXFAT_SDMMC_DAS_HANDLE 0xEFAA20
|
||||||
|
|
||||||
|
// NOPs
|
||||||
|
#define FS_OFFSET_810_EXFAT_SD_DAS_INIT 0x93308
|
||||||
|
|
||||||
|
// Nintendo Paths
|
||||||
|
#define FS_OFFSET_810_EXFAT_NINTENDO_PATHS \
|
||||||
|
{ \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0008ABA0, .add_rel_offset = 4}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0008C634, .add_rel_offset = 4}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0008C828, .add_rel_offset = 4}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x0008CC04, .add_rel_offset = 4}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x0008CDC8, .add_rel_offset = 4}, \
|
||||||
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __FS_810_EXFAT_H__
|
||||||
59
emummc/source/FS/offsets/900.h
Normal file
59
emummc/source/FS/offsets/900.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 m4xw <m4x@m4xw.net>
|
||||||
|
* Copyright (c) 2019 Atmosphere-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/>.
|
||||||
|
*/
|
||||||
|
#ifndef __FS_900_H__
|
||||||
|
#define __FS_900_H__
|
||||||
|
|
||||||
|
// Accessor vtable getters
|
||||||
|
#define FS_OFFSET_900_SDMMC_ACCESSOR_GC 0x1430F0
|
||||||
|
#define FS_OFFSET_900_SDMMC_ACCESSOR_SD 0x141200
|
||||||
|
#define FS_OFFSET_900_SDMMC_ACCESSOR_NAND 0x13C080
|
||||||
|
|
||||||
|
// Hooks
|
||||||
|
#define FS_OFFSET_900_SDMMC_WRAPPER_READ 0x1377E0
|
||||||
|
#define FS_OFFSET_900_SDMMC_WRAPPER_WRITE 0x1378C0
|
||||||
|
#define FS_OFFSET_900_RTLD 0x454
|
||||||
|
#define FS_OFFSET_900_RTLD_DESTINATION 0x9C
|
||||||
|
|
||||||
|
#define FS_OFFSET_900_CLKRST_SET_MIN_V_CLK_RATE 0x136A00
|
||||||
|
|
||||||
|
// Misc funcs
|
||||||
|
#define FS_OFFSET_900_LOCK_MUTEX 0x25280
|
||||||
|
#define FS_OFFSET_900_UNLOCK_MUTEX 0x252D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_900_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x137740
|
||||||
|
|
||||||
|
// Misc Data
|
||||||
|
#define FS_OFFSET_900_SD_MUTEX 0xE1D3E8
|
||||||
|
#define FS_OFFSET_900_NAND_MUTEX 0xE18258
|
||||||
|
#define FS_OFFSET_900_ACTIVE_PARTITION 0xE18298
|
||||||
|
#define FS_OFFSET_900_SDMMC_DAS_HANDLE 0xDFEFA0
|
||||||
|
|
||||||
|
// NOPs
|
||||||
|
#define FS_OFFSET_900_SD_DAS_INIT 0x1472BC
|
||||||
|
|
||||||
|
// Nintendo Paths
|
||||||
|
#define FS_OFFSET_900_NINTENDO_PATHS \
|
||||||
|
{ \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00068A60, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00070A40, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00081CB4, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00081EF4, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x0008211C, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __FS_900_H__
|
||||||
59
emummc/source/FS/offsets/900_exfat.h
Normal file
59
emummc/source/FS/offsets/900_exfat.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 m4xw <m4x@m4xw.net>
|
||||||
|
* Copyright (c) 2019 Atmosphere-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/>.
|
||||||
|
*/
|
||||||
|
#ifndef __FS_900_EXFAT_H__
|
||||||
|
#define __FS_900_EXFAT_H__
|
||||||
|
|
||||||
|
// Accessor vtable getters
|
||||||
|
#define FS_OFFSET_900_EXFAT_SDMMC_ACCESSOR_GC 0x1430F0
|
||||||
|
#define FS_OFFSET_900_EXFAT_SDMMC_ACCESSOR_SD 0x141200
|
||||||
|
#define FS_OFFSET_900_EXFAT_SDMMC_ACCESSOR_NAND 0x13C080
|
||||||
|
|
||||||
|
// Hooks
|
||||||
|
#define FS_OFFSET_900_EXFAT_SDMMC_WRAPPER_READ 0x1377E0
|
||||||
|
#define FS_OFFSET_900_EXFAT_SDMMC_WRAPPER_WRITE 0x1378C0
|
||||||
|
#define FS_OFFSET_900_EXFAT_RTLD 0x454
|
||||||
|
#define FS_OFFSET_900_EXFAT_RTLD_DESTINATION 0x9C
|
||||||
|
|
||||||
|
#define FS_OFFSET_900_EXFAT_CLKRST_SET_MIN_V_CLK_RATE 0x136A00
|
||||||
|
|
||||||
|
// Misc funcs
|
||||||
|
#define FS_OFFSET_900_EXFAT_LOCK_MUTEX 0x25280
|
||||||
|
#define FS_OFFSET_900_EXFAT_UNLOCK_MUTEX 0x252D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_900_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x137740
|
||||||
|
|
||||||
|
// Misc Data
|
||||||
|
#define FS_OFFSET_900_EXFAT_SD_MUTEX 0xE2B3E8
|
||||||
|
#define FS_OFFSET_900_EXFAT_NAND_MUTEX 0xE26258
|
||||||
|
#define FS_OFFSET_900_EXFAT_ACTIVE_PARTITION 0xE26298
|
||||||
|
#define FS_OFFSET_900_EXFAT_SDMMC_DAS_HANDLE 0xE0CFA0
|
||||||
|
|
||||||
|
// NOPs
|
||||||
|
#define FS_OFFSET_900_EXFAT_SD_DAS_INIT 0x1472BC
|
||||||
|
|
||||||
|
// Nintendo Paths
|
||||||
|
#define FS_OFFSET_900_EXFAT_NINTENDO_PATHS \
|
||||||
|
{ \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00068A60, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00070A40, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00081CB4, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00081EF4, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x0008211C, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __FS_900_EXFAT_H__
|
||||||
59
emummc/source/FS/offsets/910.h
Normal file
59
emummc/source/FS/offsets/910.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 m4xw <m4x@m4xw.net>
|
||||||
|
* Copyright (c) 2019 Atmosphere-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/>.
|
||||||
|
*/
|
||||||
|
#ifndef __FS_910_H__
|
||||||
|
#define __FS_910_H__
|
||||||
|
|
||||||
|
// Accessor vtable getters
|
||||||
|
#define FS_OFFSET_910_SDMMC_ACCESSOR_GC 0x143100
|
||||||
|
#define FS_OFFSET_910_SDMMC_ACCESSOR_SD 0x141210
|
||||||
|
#define FS_OFFSET_910_SDMMC_ACCESSOR_NAND 0x13C090
|
||||||
|
|
||||||
|
// Hooks
|
||||||
|
#define FS_OFFSET_910_SDMMC_WRAPPER_READ 0x1377F0
|
||||||
|
#define FS_OFFSET_910_SDMMC_WRAPPER_WRITE 0x1378D0
|
||||||
|
#define FS_OFFSET_910_RTLD 0x454
|
||||||
|
#define FS_OFFSET_910_RTLD_DESTINATION 0x9C
|
||||||
|
|
||||||
|
#define FS_OFFSET_910_CLKRST_SET_MIN_V_CLK_RATE 0x136A10
|
||||||
|
|
||||||
|
// Misc funcs
|
||||||
|
#define FS_OFFSET_910_LOCK_MUTEX 0x25280
|
||||||
|
#define FS_OFFSET_910_UNLOCK_MUTEX 0x252D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_910_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x137750
|
||||||
|
|
||||||
|
// Misc Data
|
||||||
|
#define FS_OFFSET_910_SD_MUTEX 0xE1D3E8
|
||||||
|
#define FS_OFFSET_910_NAND_MUTEX 0xE18258
|
||||||
|
#define FS_OFFSET_910_ACTIVE_PARTITION 0xE18298
|
||||||
|
#define FS_OFFSET_910_SDMMC_DAS_HANDLE 0xDFEFA0
|
||||||
|
|
||||||
|
// NOPs
|
||||||
|
#define FS_OFFSET_910_SD_DAS_INIT 0x1472CC
|
||||||
|
|
||||||
|
// Nintendo Paths
|
||||||
|
#define FS_OFFSET_910_NINTENDO_PATHS \
|
||||||
|
{ \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00068A70, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00070A50, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00081CC4, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00081F04, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x0008212C, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __FS_910_H__
|
||||||
59
emummc/source/FS/offsets/910_exfat.h
Normal file
59
emummc/source/FS/offsets/910_exfat.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 m4xw <m4x@m4xw.net>
|
||||||
|
* Copyright (c) 2019 Atmosphere-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/>.
|
||||||
|
*/
|
||||||
|
#ifndef __FS_910_EXFAT_H__
|
||||||
|
#define __FS_910_EXFAT_H__
|
||||||
|
|
||||||
|
// Accessor vtable getters
|
||||||
|
#define FS_OFFSET_910_EXFAT_SDMMC_ACCESSOR_GC 0x143100
|
||||||
|
#define FS_OFFSET_910_EXFAT_SDMMC_ACCESSOR_SD 0x141210
|
||||||
|
#define FS_OFFSET_910_EXFAT_SDMMC_ACCESSOR_NAND 0x13C090
|
||||||
|
|
||||||
|
// Hooks
|
||||||
|
#define FS_OFFSET_910_EXFAT_SDMMC_WRAPPER_READ 0x1377F0
|
||||||
|
#define FS_OFFSET_910_EXFAT_SDMMC_WRAPPER_WRITE 0x1378D0
|
||||||
|
#define FS_OFFSET_910_EXFAT_RTLD 0x454
|
||||||
|
#define FS_OFFSET_910_EXFAT_RTLD_DESTINATION 0x9C
|
||||||
|
|
||||||
|
#define FS_OFFSET_910_EXFAT_CLKRST_SET_MIN_V_CLK_RATE 0x136A10
|
||||||
|
|
||||||
|
// Misc funcs
|
||||||
|
#define FS_OFFSET_910_EXFAT_LOCK_MUTEX 0x25280
|
||||||
|
#define FS_OFFSET_910_EXFAT_UNLOCK_MUTEX 0x252D0
|
||||||
|
|
||||||
|
#define FS_OFFSET_910_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x137750
|
||||||
|
|
||||||
|
// Misc Data
|
||||||
|
#define FS_OFFSET_910_EXFAT_SD_MUTEX 0xE2B3E8
|
||||||
|
#define FS_OFFSET_910_EXFAT_NAND_MUTEX 0xE26258
|
||||||
|
#define FS_OFFSET_910_EXFAT_ACTIVE_PARTITION 0xE26298
|
||||||
|
#define FS_OFFSET_910_EXFAT_SDMMC_DAS_HANDLE 0xE0CFA0
|
||||||
|
|
||||||
|
// NOPs
|
||||||
|
#define FS_OFFSET_910_EXFAT_SD_DAS_INIT 0x1472CC
|
||||||
|
|
||||||
|
// Nintendo Paths
|
||||||
|
#define FS_OFFSET_910_EXFAT_NINTENDO_PATHS \
|
||||||
|
{ \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00068A70, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00070A50, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00081CC4, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 3, .adrp_offset = 0x00081F04, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 4, .adrp_offset = 0x0008212C, .add_rel_offset = 0x00000004}, \
|
||||||
|
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __FS_910_EXFAT_H__
|
||||||
@@ -23,9 +23,15 @@
|
|||||||
#include "sd.h"
|
#include "sd.h"
|
||||||
#include "../utils/types.h"
|
#include "../utils/types.h"
|
||||||
#include "../utils/util.h"
|
#include "../utils/util.h"
|
||||||
|
#include "../utils/fatal.h"
|
||||||
|
#include "../emuMMC/emummc.h"
|
||||||
|
|
||||||
#define DPRINTF(...) //fprintf(stdout, __VA_ARGS__)
|
#define DPRINTF(...) //fprintf(stdout, __VA_ARGS__)
|
||||||
|
|
||||||
|
sdmmc_accessor_t *_current_accessor = NULL;
|
||||||
|
bool sdmmc_memcpy_buf = false;
|
||||||
|
extern bool custom_driver;
|
||||||
|
|
||||||
static inline u32 unstuff_bits(u32 *resp, u32 start, u32 size)
|
static inline u32 unstuff_bits(u32 *resp, u32 start, u32 size)
|
||||||
{
|
{
|
||||||
const u32 mask = (size < 32 ? 1 << size : 0) - 1;
|
const u32 mask = (size < 32 ? 1 << size : 0) - 1;
|
||||||
@@ -41,6 +47,119 @@ static inline u32 unstuff_bits(u32 *resp, u32 start, u32 size)
|
|||||||
* Common functions for SD and MMC.
|
* Common functions for SD and MMC.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// FS DMA calculations.
|
||||||
|
intptr_t sdmmc_calculate_dma_addr(sdmmc_accessor_t *_this, void *buf, unsigned int num_sectors)
|
||||||
|
{
|
||||||
|
int dma_buf_idx = 0;
|
||||||
|
char *_buf = (char *)buf;
|
||||||
|
char *actual_buf_start = _buf;
|
||||||
|
char *actual_buf_end = &_buf[512 * num_sectors];
|
||||||
|
char *dma_buffer_start = _this->parent->dmaBuffers[0].device_addr_buffer;
|
||||||
|
|
||||||
|
if (dma_buffer_start <= _buf && actual_buf_end <= &dma_buffer_start[_this->parent->dmaBuffers[0].device_addr_buffer_size])
|
||||||
|
{
|
||||||
|
dma_buf_idx = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dma_buffer_start = _this->parent->dmaBuffers[1].device_addr_buffer;
|
||||||
|
if (dma_buffer_start <= actual_buf_start && actual_buf_end <= &dma_buffer_start[_this->parent->dmaBuffers[1].device_addr_buffer_size])
|
||||||
|
{
|
||||||
|
dma_buf_idx = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dma_buffer_start = _this->parent->dmaBuffers[2].device_addr_buffer;
|
||||||
|
if (dma_buffer_start <= actual_buf_start && actual_buf_end <= &dma_buffer_start[_this->parent->dmaBuffers[2].device_addr_buffer_size])
|
||||||
|
{
|
||||||
|
dma_buf_idx = 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If buffer is on a random heap
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sdmmc_memcpy_buf = false;
|
||||||
|
|
||||||
|
intptr_t admaaddr = (intptr_t)&_this->parent->dmaBuffers[dma_buf_idx].device_addr_buffer_masked[actual_buf_start - dma_buffer_start];
|
||||||
|
return admaaddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sdmmc_calculate_dma_index(sdmmc_accessor_t *_this, void *buf, unsigned int num_sectors)
|
||||||
|
{
|
||||||
|
int dma_buf_idx = 0;
|
||||||
|
char *_buf = (char *)buf;
|
||||||
|
char *actual_buf_start = _buf;
|
||||||
|
char *actual_buf_end = &_buf[512 * num_sectors];
|
||||||
|
char *dma_buffer_start = _this->parent->dmaBuffers[0].device_addr_buffer;
|
||||||
|
|
||||||
|
if (dma_buffer_start <= _buf && actual_buf_end <= &dma_buffer_start[_this->parent->dmaBuffers[0].device_addr_buffer_size])
|
||||||
|
{
|
||||||
|
dma_buf_idx = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dma_buffer_start = _this->parent->dmaBuffers[1].device_addr_buffer;
|
||||||
|
if (dma_buffer_start <= actual_buf_start && actual_buf_end <= &dma_buffer_start[_this->parent->dmaBuffers[1].device_addr_buffer_size])
|
||||||
|
{
|
||||||
|
dma_buf_idx = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dma_buffer_start = _this->parent->dmaBuffers[2].device_addr_buffer;
|
||||||
|
if (dma_buffer_start <= actual_buf_start && actual_buf_end <= &dma_buffer_start[_this->parent->dmaBuffers[2].device_addr_buffer_size])
|
||||||
|
{
|
||||||
|
dma_buf_idx = 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If buffer is on a random heap
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sdmmc_memcpy_buf = false;
|
||||||
|
|
||||||
|
return dma_buf_idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sdmmc_calculate_fitting_dma_index(sdmmc_accessor_t *_this, unsigned int num_sectors)
|
||||||
|
{
|
||||||
|
int dma_buf_idx = 0;
|
||||||
|
int blkSize = num_sectors * 512;
|
||||||
|
|
||||||
|
if (_this->parent->dmaBuffers[0].device_addr_buffer_size >= blkSize)
|
||||||
|
{
|
||||||
|
dma_buf_idx = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_this->parent->dmaBuffers[1].device_addr_buffer_size >= blkSize)
|
||||||
|
{
|
||||||
|
dma_buf_idx = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_this->parent->dmaBuffers[2].device_addr_buffer_size >= blkSize)
|
||||||
|
{
|
||||||
|
dma_buf_idx = 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Can't find a fitting buffer
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sdmmc_memcpy_buf = true;
|
||||||
|
return dma_buf_idx;
|
||||||
|
}
|
||||||
|
|
||||||
static int _sdmmc_storage_check_result(u32 res)
|
static int _sdmmc_storage_check_result(u32 res)
|
||||||
{
|
{
|
||||||
//Error mask:
|
//Error mask:
|
||||||
@@ -129,9 +248,11 @@ static int _sdmmc_storage_check_status(sdmmc_storage_t *storage)
|
|||||||
static int _sdmmc_storage_readwrite_ex(sdmmc_storage_t *storage, u32 *blkcnt_out, u32 sector, u32 num_sectors, void *buf, u32 is_write)
|
static int _sdmmc_storage_readwrite_ex(sdmmc_storage_t *storage, u32 *blkcnt_out, u32 sector, u32 num_sectors, void *buf, u32 is_write)
|
||||||
{
|
{
|
||||||
sdmmc_cmd_t cmdbuf;
|
sdmmc_cmd_t cmdbuf;
|
||||||
|
sdmmc_req_t reqbuf;
|
||||||
|
u32 tmp = 0;
|
||||||
|
|
||||||
sdmmc_init_cmd(&cmdbuf, is_write ? MMC_WRITE_MULTIPLE_BLOCK : MMC_READ_MULTIPLE_BLOCK, sector, SDMMC_RSP_TYPE_1, 0);
|
sdmmc_init_cmd(&cmdbuf, is_write ? MMC_WRITE_MULTIPLE_BLOCK : MMC_READ_MULTIPLE_BLOCK, sector, SDMMC_RSP_TYPE_1, 0);
|
||||||
|
|
||||||
sdmmc_req_t reqbuf;
|
|
||||||
reqbuf.buf = buf;
|
reqbuf.buf = buf;
|
||||||
reqbuf.num_sectors = num_sectors;
|
reqbuf.num_sectors = num_sectors;
|
||||||
reqbuf.blksize = 512;
|
reqbuf.blksize = 512;
|
||||||
@@ -140,12 +261,12 @@ static int _sdmmc_storage_readwrite_ex(sdmmc_storage_t *storage, u32 *blkcnt_out
|
|||||||
reqbuf.is_auto_cmd12 = 1;
|
reqbuf.is_auto_cmd12 = 1;
|
||||||
|
|
||||||
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, blkcnt_out))
|
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, blkcnt_out))
|
||||||
{
|
{
|
||||||
u32 tmp = 0;
|
|
||||||
sdmmc_stop_transmission(storage->sdmmc, &tmp);
|
sdmmc_stop_transmission(storage->sdmmc, &tmp);
|
||||||
_sdmmc_storage_get_status(storage, &tmp, 0);
|
_sdmmc_storage_get_status(storage, &tmp, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,14 +307,112 @@ out:;
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern _sdmmc_accessor_sd sdmmc_accessor_sd;
|
||||||
|
extern _sdmmc_accessor_nand sdmmc_accessor_nand;
|
||||||
int sdmmc_storage_read(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf)
|
int sdmmc_storage_read(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf)
|
||||||
{
|
{
|
||||||
return _sdmmc_storage_readwrite(storage, sector, num_sectors, buf, 0);
|
if (!custom_driver)
|
||||||
|
{
|
||||||
|
sdmmc_accessor_t *accessor_sd = sdmmc_accessor_sd();
|
||||||
|
sdmmc_accessor_t *accessor_nand = sdmmc_accessor_nand();
|
||||||
|
|
||||||
|
if (sdmmc_calculate_dma_addr(accessor_sd, buf, num_sectors))
|
||||||
|
{
|
||||||
|
return !accessor_sd->vtab->read_write(accessor_sd, sector, num_sectors, buf, num_sectors * 512, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (sdmmc_calculate_dma_addr(accessor_nand, buf, num_sectors))
|
||||||
|
{
|
||||||
|
// buf is on the nand dma buffer
|
||||||
|
int original_dma_idx = sdmmc_calculate_dma_index(accessor_nand, buf, num_sectors);
|
||||||
|
sdmmc_dma_buffer_t *original_dma_buffer = &accessor_nand->parent->dmaBuffers[original_dma_idx];
|
||||||
|
|
||||||
|
// Next entry
|
||||||
|
int dma_idx = sdmmc_calculate_fitting_dma_index(accessor_sd, num_sectors) + 1;
|
||||||
|
|
||||||
|
accessor_sd->parent->dmaBuffers[dma_idx].device_addr_buffer = original_dma_buffer->device_addr_buffer;
|
||||||
|
accessor_sd->parent->dmaBuffers[dma_idx].device_addr_buffer_masked = original_dma_buffer->device_addr_buffer_masked;
|
||||||
|
accessor_sd->parent->dmaBuffers[dma_idx].device_addr_buffer_size = original_dma_buffer->device_addr_buffer_size;
|
||||||
|
|
||||||
|
u64 res = accessor_sd->vtab->read_write(accessor_sd, sector, num_sectors, buf, num_sectors * 512, 1);
|
||||||
|
|
||||||
|
accessor_sd->parent->dmaBuffers[dma_idx].device_addr_buffer = 0;
|
||||||
|
accessor_sd->parent->dmaBuffers[dma_idx].device_addr_buffer_masked = 0;
|
||||||
|
accessor_sd->parent->dmaBuffers[dma_idx].device_addr_buffer_size = 0;
|
||||||
|
|
||||||
|
return !res;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// buf is on a heap
|
||||||
|
int dma_idx = sdmmc_calculate_fitting_dma_index(accessor_sd, num_sectors);
|
||||||
|
void *dma_buf = &accessor_sd->parent->dmaBuffers[dma_idx].device_addr_buffer[0];
|
||||||
|
|
||||||
|
u64 res = accessor_sd->vtab->read_write(accessor_sd, sector, num_sectors, dma_buf, num_sectors * 512, 1);
|
||||||
|
memcpy(buf, dma_buf, num_sectors * 512);
|
||||||
|
|
||||||
|
return !res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return _sdmmc_storage_readwrite(storage, sector, num_sectors, buf, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int sdmmc_storage_write(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf)
|
int sdmmc_storage_write(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf)
|
||||||
{
|
{
|
||||||
return _sdmmc_storage_readwrite(storage, sector, num_sectors, buf, 1);
|
if (!custom_driver)
|
||||||
|
{
|
||||||
|
sdmmc_accessor_t *accessor_sd = sdmmc_accessor_sd();
|
||||||
|
sdmmc_accessor_t *accessor_nand = sdmmc_accessor_nand();
|
||||||
|
|
||||||
|
if (sdmmc_calculate_dma_addr(accessor_sd, buf, num_sectors))
|
||||||
|
{
|
||||||
|
return !accessor_sd->vtab->read_write(accessor_sd, sector, num_sectors, buf, num_sectors * 512, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (sdmmc_calculate_dma_addr(accessor_nand, buf, num_sectors))
|
||||||
|
{
|
||||||
|
// buf is on the nand dma buffer
|
||||||
|
int original_dma_idx = sdmmc_calculate_dma_index(accessor_nand, buf, num_sectors);
|
||||||
|
sdmmc_dma_buffer_t *original_dma_buffer = &accessor_nand->parent->dmaBuffers[original_dma_idx];
|
||||||
|
|
||||||
|
// Next entry
|
||||||
|
int dma_idx = sdmmc_calculate_fitting_dma_index(accessor_sd, num_sectors) + 1;
|
||||||
|
|
||||||
|
accessor_sd->parent->dmaBuffers[dma_idx].device_addr_buffer = original_dma_buffer->device_addr_buffer;
|
||||||
|
accessor_sd->parent->dmaBuffers[dma_idx].device_addr_buffer_masked = original_dma_buffer->device_addr_buffer_masked;
|
||||||
|
accessor_sd->parent->dmaBuffers[dma_idx].device_addr_buffer_size = original_dma_buffer->device_addr_buffer_size;
|
||||||
|
|
||||||
|
u64 res = accessor_sd->vtab->read_write(accessor_sd, sector, num_sectors, buf, num_sectors * 512, 0);
|
||||||
|
|
||||||
|
accessor_sd->parent->dmaBuffers[dma_idx].device_addr_buffer = 0;
|
||||||
|
accessor_sd->parent->dmaBuffers[dma_idx].device_addr_buffer_masked = 0;
|
||||||
|
accessor_sd->parent->dmaBuffers[dma_idx].device_addr_buffer_size = 0;
|
||||||
|
|
||||||
|
return !res;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// buf is on a heap
|
||||||
|
int dma_idx = sdmmc_calculate_fitting_dma_index(accessor_sd, num_sectors);
|
||||||
|
void *dma_buf = &accessor_sd->parent->dmaBuffers[dma_idx].device_addr_buffer[0];
|
||||||
|
|
||||||
|
memcpy(dma_buf, buf, num_sectors * 512);
|
||||||
|
u64 res = accessor_sd->vtab->read_write(accessor_sd, sector, num_sectors, dma_buf, num_sectors * 512, 0);
|
||||||
|
|
||||||
|
return !res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return _sdmmc_storage_readwrite(storage, sector, num_sectors, buf, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -623,7 +842,7 @@ static int _sd_storage_get_op_cond(sdmmc_storage_t *storage, int is_version_1, i
|
|||||||
if (cond & SD_OCR_CCS)
|
if (cond & SD_OCR_CCS)
|
||||||
storage->has_sector_access = 1;
|
storage->has_sector_access = 1;
|
||||||
|
|
||||||
if (false && cond & SD_ROCR_S18A && supports_low_voltage)
|
if (cond & SD_ROCR_S18A && supports_low_voltage)
|
||||||
{
|
{
|
||||||
//The low voltage regulator configuration is valid for SDMMC1 only.
|
//The low voltage regulator configuration is valid for SDMMC1 only.
|
||||||
if (storage->sdmmc->id == SDMMC_1 &&
|
if (storage->sdmmc->id == SDMMC_1 &&
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
#define _SDMMC_H_
|
#define _SDMMC_H_
|
||||||
|
|
||||||
#include "../utils/types.h"
|
#include "../utils/types.h"
|
||||||
|
#include "../FS/FS.h"
|
||||||
#include "sdmmc_driver.h"
|
#include "sdmmc_driver.h"
|
||||||
|
|
||||||
typedef struct _mmc_cid
|
typedef struct _mmc_cid
|
||||||
@@ -102,6 +103,9 @@ typedef struct _sdmmc_storage_t
|
|||||||
sd_ssr_t ssr;
|
sd_ssr_t ssr;
|
||||||
} sdmmc_storage_t;
|
} sdmmc_storage_t;
|
||||||
|
|
||||||
|
extern sdmmc_accessor_t *_current_accessor;
|
||||||
|
extern bool sdmmc_memcpy_buf;
|
||||||
|
|
||||||
int sdmmc_storage_end(sdmmc_storage_t *storage);
|
int sdmmc_storage_end(sdmmc_storage_t *storage);
|
||||||
int sdmmc_storage_read(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf);
|
int sdmmc_storage_read(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf);
|
||||||
int sdmmc_storage_write(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf);
|
int sdmmc_storage_write(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf);
|
||||||
@@ -109,5 +113,8 @@ int sdmmc_storage_init_mmc(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 id, u32
|
|||||||
int sdmmc_storage_set_mmc_partition(sdmmc_storage_t *storage, u32 partition);
|
int sdmmc_storage_set_mmc_partition(sdmmc_storage_t *storage, u32 partition);
|
||||||
int sdmmc_storage_init_sd(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 id, u32 bus_width, u32 type);
|
int sdmmc_storage_init_sd(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 id, u32 bus_width, u32 type);
|
||||||
int sdmmc_storage_init_gc(sdmmc_storage_t *storage, sdmmc_t *sdmmc);
|
int sdmmc_storage_init_gc(sdmmc_storage_t *storage, sdmmc_t *sdmmc);
|
||||||
|
intptr_t sdmmc_calculate_dma_addr(sdmmc_accessor_t *_this, void *buf, unsigned int num_sectors);
|
||||||
|
int sdmmc_calculate_dma_index(sdmmc_accessor_t *_this, void *buf, unsigned int num_sectors);
|
||||||
|
int sdmmc_calculate_fitting_dma_index(sdmmc_accessor_t *_this, unsigned int num_sectors);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
#include "../soc/pmc.h"
|
#include "../soc/pmc.h"
|
||||||
#include "../soc/pinmux.h"
|
#include "../soc/pinmux.h"
|
||||||
#include "../soc/gpio.h"
|
#include "../soc/gpio.h"
|
||||||
|
#include "../utils/fatal.h"
|
||||||
|
|
||||||
#define DPRINTF(...)
|
#define DPRINTF(...)
|
||||||
|
|
||||||
@@ -788,7 +789,15 @@ static int _sdmmc_config_dma(sdmmc_t *sdmmc, u32 *blkcnt_out, sdmmc_req_t *req)
|
|||||||
u32 blkcnt = req->num_sectors;
|
u32 blkcnt = req->num_sectors;
|
||||||
if (blkcnt >= 0xFFFF)
|
if (blkcnt >= 0xFFFF)
|
||||||
blkcnt = 0xFFFF;
|
blkcnt = 0xFFFF;
|
||||||
u64 admaaddr = sdmmc->dma_addr_fs;
|
|
||||||
|
u64 admaaddr = (u64)sdmmc_calculate_dma_addr(_current_accessor, req->buf, blkcnt);
|
||||||
|
if (!admaaddr)
|
||||||
|
{
|
||||||
|
// buf is on a heap
|
||||||
|
int dma_idx = sdmmc_calculate_fitting_dma_index(_current_accessor, blkcnt);
|
||||||
|
admaaddr = (u64)&_current_accessor->parent->dmaBuffers[dma_idx].device_addr_buffer_masked[0];
|
||||||
|
sdmmc->last_dma_idx = dma_idx;
|
||||||
|
}
|
||||||
|
|
||||||
//Check alignment.
|
//Check alignment.
|
||||||
if (admaaddr & 7)
|
if (admaaddr & 7)
|
||||||
@@ -870,7 +879,22 @@ static int _sdmmc_execute_cmd_inner(sdmmc_t *sdmmc, sdmmc_cmd_t *cmd, sdmmc_req_
|
|||||||
if (req)
|
if (req)
|
||||||
{
|
{
|
||||||
_sdmmc_config_dma(sdmmc, &blkcnt, req);
|
_sdmmc_config_dma(sdmmc, &blkcnt, req);
|
||||||
armDCacheFlush(req->buf, req->blksize * blkcnt);
|
if(!sdmmc_memcpy_buf)
|
||||||
|
{
|
||||||
|
// Flush from/to phys
|
||||||
|
armDCacheFlush(req->buf, req->blksize * blkcnt);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(req->is_write)
|
||||||
|
{
|
||||||
|
void* dma_addr = &_current_accessor->parent->dmaBuffers[sdmmc->last_dma_idx].device_addr_buffer[0];
|
||||||
|
memcpy(dma_addr, req->buf, req->blksize * blkcnt);
|
||||||
|
|
||||||
|
// Flush to phys
|
||||||
|
armDCacheFlush(dma_addr, req->blksize * blkcnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_sdmmc_enable_interrupts(sdmmc);
|
_sdmmc_enable_interrupts(sdmmc);
|
||||||
is_data_present = true;
|
is_data_present = true;
|
||||||
@@ -892,8 +916,15 @@ static int _sdmmc_execute_cmd_inner(sdmmc_t *sdmmc, sdmmc_cmd_t *cmd, sdmmc_req_
|
|||||||
{
|
{
|
||||||
sdmmc->expected_rsp_type = cmd->rsp_type;
|
sdmmc->expected_rsp_type = cmd->rsp_type;
|
||||||
_sdmmc_cache_rsp(sdmmc, sdmmc->rsp, 0x10, cmd->rsp_type);
|
_sdmmc_cache_rsp(sdmmc, sdmmc->rsp, 0x10, cmd->rsp_type);
|
||||||
|
|
||||||
|
/*if(sdmmc->rsp[0] & 0xFDF9A080)
|
||||||
|
{
|
||||||
|
res = 0;
|
||||||
|
sdmmc->rsp[0] = 0; // Reset error
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
if (req)
|
|
||||||
|
if (res && req)
|
||||||
_sdmmc_update_dma(sdmmc);
|
_sdmmc_update_dma(sdmmc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -903,7 +934,22 @@ static int _sdmmc_execute_cmd_inner(sdmmc_t *sdmmc, sdmmc_cmd_t *cmd, sdmmc_req_
|
|||||||
{
|
{
|
||||||
if (req)
|
if (req)
|
||||||
{
|
{
|
||||||
armDCacheFlush(req->buf, req->blksize * blkcnt);
|
if(!req->is_write)
|
||||||
|
{
|
||||||
|
if(!sdmmc_memcpy_buf)
|
||||||
|
{
|
||||||
|
// Flush from phys
|
||||||
|
armDCacheFlush(req->buf, req->blksize * blkcnt);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
void* dma_addr = &_current_accessor->parent->dmaBuffers[sdmmc->last_dma_idx].device_addr_buffer[0];
|
||||||
|
// Flush from phys
|
||||||
|
armDCacheFlush(dma_addr, req->blksize * blkcnt);
|
||||||
|
// Copy to buffer
|
||||||
|
memcpy(req->buf, dma_addr, req->blksize * blkcnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (blkcnt_out)
|
if (blkcnt_out)
|
||||||
*blkcnt_out = blkcnt;
|
*blkcnt_out = blkcnt;
|
||||||
@@ -948,10 +994,13 @@ static int _sdmmc_config_sdmmc1()
|
|||||||
PINMUX_AUX(PINMUX_AUX_SDMMC1_DAT1) = PINMUX_DRIVE_2X | PINMUX_INPUT_ENABLE | PINMUX_PARKED | PINMUX_PULL_UP;
|
PINMUX_AUX(PINMUX_AUX_SDMMC1_DAT1) = PINMUX_DRIVE_2X | PINMUX_INPUT_ENABLE | PINMUX_PARKED | PINMUX_PULL_UP;
|
||||||
PINMUX_AUX(PINMUX_AUX_SDMMC1_DAT0) = PINMUX_DRIVE_2X | PINMUX_INPUT_ENABLE | PINMUX_PARKED | PINMUX_PULL_UP;
|
PINMUX_AUX(PINMUX_AUX_SDMMC1_DAT0) = PINMUX_DRIVE_2X | PINMUX_INPUT_ENABLE | PINMUX_PARKED | PINMUX_PULL_UP;
|
||||||
|
|
||||||
|
//Make sure SDMMC1 controller is reset.
|
||||||
|
smcReadWriteRegister(PMC_BASE + APBDEV_PMC_NO_IOPOWER, (1 << 12), (1 << 12));
|
||||||
|
usleep(1000);
|
||||||
|
|
||||||
//Make sure the SDMMC1 controller is powered.
|
//Make sure the SDMMC1 controller is powered.
|
||||||
//PMC(APBDEV_PMC_NO_IOPOWER) &= ~(1 << 12);
|
smcReadWriteRegister(PMC_BASE + APBDEV_PMC_NO_IOPOWER, ~(1 << 12), (1 << 12));
|
||||||
//Assume 3.3V SD card voltage.
|
smcReadWriteRegister(PMC_BASE + APBDEV_PMC_PWR_DET_VAL, (1 << 12), (1 << 12));
|
||||||
//PMC(APBDEV_PMC_PWR_DET_VAL) |= (1 << 12);
|
|
||||||
|
|
||||||
//Set enable SD card power.
|
//Set enable SD card power.
|
||||||
PINMUX_AUX(PINMUX_AUX_DMIC3_CLK) = PINMUX_INPUT_ENABLE | PINMUX_PULL_DOWN | 1; //GPIO control, pull down.
|
PINMUX_AUX(PINMUX_AUX_DMIC3_CLK) = PINMUX_INPUT_ENABLE | PINMUX_PULL_DOWN | 1; //GPIO control, pull down.
|
||||||
@@ -962,10 +1011,10 @@ static int _sdmmc_config_sdmmc1()
|
|||||||
usleep(1000);
|
usleep(1000);
|
||||||
|
|
||||||
//Enable SD card power.
|
//Enable SD card power.
|
||||||
//max77620_regulator_set_voltage(REGULATOR_LDO2, 3300000);
|
max77620_regulator_set_voltage(REGULATOR_LDO2, 3300000);
|
||||||
//max77620_regulator_enable(REGULATOR_LDO2, 1);
|
max77620_regulator_enable(REGULATOR_LDO2, 1);
|
||||||
|
|
||||||
//usleep(1000);
|
usleep(1000);
|
||||||
|
|
||||||
//For good measure.
|
//For good measure.
|
||||||
APB_MISC(APB_MISC_GP_SDMMC1_PAD_CFGPADCTRL) = 0x10000000;
|
APB_MISC(APB_MISC_GP_SDMMC1_PAD_CFGPADCTRL) = 0x10000000;
|
||||||
@@ -1008,7 +1057,7 @@ int sdmmc_init(sdmmc_t *sdmmc, u32 id, u32 power, u32 bus_width, u32 type, int n
|
|||||||
sdmmc->regs->veniotrimctl &= 0xFFFFFFFB;
|
sdmmc->regs->veniotrimctl &= 0xFFFFFFFB;
|
||||||
static const u32 trim_values[] = { 2, 8, 3, 8 };
|
static const u32 trim_values[] = { 2, 8, 3, 8 };
|
||||||
sdmmc->regs->venclkctl = (sdmmc->regs->venclkctl & 0xE0FFFFFF) | (trim_values[sdmmc->id] << 24);
|
sdmmc->regs->venclkctl = (sdmmc->regs->venclkctl & 0xE0FFFFFF) | (trim_values[sdmmc->id] << 24);
|
||||||
sdmmc->regs->sdmemcmppadctl = (sdmmc->regs->sdmemcmppadctl & 0xF) | 7;
|
sdmmc->regs->sdmemcmppadctl = (sdmmc->regs->sdmemcmppadctl & 0xFFFFFFF0) | 7;
|
||||||
if (!_sdmmc_autocal_config_offset(sdmmc, power))
|
if (!_sdmmc_autocal_config_offset(sdmmc, power))
|
||||||
return 0;
|
return 0;
|
||||||
_sdmmc_autocal_execute(sdmmc, power);
|
_sdmmc_autocal_execute(sdmmc, power);
|
||||||
@@ -1040,8 +1089,9 @@ void sdmmc_end(sdmmc_t *sdmmc)
|
|||||||
if (sdmmc->id == SDMMC_1)
|
if (sdmmc->id == SDMMC_1)
|
||||||
{
|
{
|
||||||
gpio_output_enable(GPIO_PORT_E, GPIO_PIN_4, GPIO_OUTPUT_DISABLE);
|
gpio_output_enable(GPIO_PORT_E, GPIO_PIN_4, GPIO_OUTPUT_DISABLE);
|
||||||
//max77620_regulator_enable(REGULATOR_LDO2, 0);
|
msleep(1); // To power cycle min 1ms without power is needed.
|
||||||
msleep(100); // To power cycle min 1ms without power is needed.
|
max77620_regulator_enable(REGULATOR_LDO2, 0);
|
||||||
|
msleep(100); // Some extra.
|
||||||
}
|
}
|
||||||
|
|
||||||
_sdmmc_get_clkcon(sdmmc);
|
_sdmmc_get_clkcon(sdmmc);
|
||||||
@@ -1095,7 +1145,7 @@ int sdmmc_enable_low_voltage(sdmmc_t *sdmmc)
|
|||||||
_sdmmc_get_clkcon(sdmmc);
|
_sdmmc_get_clkcon(sdmmc);
|
||||||
|
|
||||||
max77620_regulator_set_voltage(REGULATOR_LDO2, 1800000);
|
max77620_regulator_set_voltage(REGULATOR_LDO2, 1800000);
|
||||||
PMC(APBDEV_PMC_PWR_DET_VAL) &= ~(1 << 12);
|
smcReadWriteRegister(PMC_BASE + APBDEV_PMC_PWR_DET_VAL, ~(1 << 12), (1 << 12));
|
||||||
|
|
||||||
_sdmmc_autocal_config_offset(sdmmc, SDMMC_POWER_1_8);
|
_sdmmc_autocal_config_offset(sdmmc, SDMMC_POWER_1_8);
|
||||||
_sdmmc_autocal_execute(sdmmc, SDMMC_POWER_1_8);
|
_sdmmc_autocal_execute(sdmmc, SDMMC_POWER_1_8);
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ typedef struct _sdmmc_t
|
|||||||
int venclkctl_set;
|
int venclkctl_set;
|
||||||
u32 venclkctl_tap;
|
u32 venclkctl_tap;
|
||||||
u32 expected_rsp_type;
|
u32 expected_rsp_type;
|
||||||
u64 dma_addr_fs;
|
u64 last_dma_idx;
|
||||||
u64 dma_addr_next;
|
u64 dma_addr_next;
|
||||||
u32 rsp[4];
|
u32 rsp[4];
|
||||||
u32 rsp3;
|
u32 rsp3;
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
#include "emummc.h"
|
#include "emummc.h"
|
||||||
#include "emummc_ctx.h"
|
#include "emummc_ctx.h"
|
||||||
|
|
||||||
|
static bool sdmmc_first_init = false;
|
||||||
static bool storageMMCinitialized = false;
|
static bool storageMMCinitialized = false;
|
||||||
static bool storageSDinitialized = false;
|
static bool storageSDinitialized = false;
|
||||||
|
|
||||||
@@ -68,39 +69,32 @@ static void _sdmmc_ensure_device_attached(void)
|
|||||||
|
|
||||||
static void _sdmmc_ensure_initialized(void)
|
static void _sdmmc_ensure_initialized(void)
|
||||||
{
|
{
|
||||||
// The boot sysmodule will eventually kill power to SD. Detect this, and reinitialize when it happens.
|
|
||||||
static bool init_done = false;
|
static bool init_done = false;
|
||||||
if (!init_done)
|
|
||||||
|
// First Initial init
|
||||||
|
if (!sdmmc_first_init)
|
||||||
{
|
{
|
||||||
if (gpio_read(GPIO_PORT_E, GPIO_PIN_4) == 0)
|
sdmmc_initialize();
|
||||||
|
sdmmc_first_init = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// The boot sysmodule will eventually kill power to SD. Detect this, and reinitialize when it happens.
|
||||||
|
if (!init_done)
|
||||||
{
|
{
|
||||||
sdmmc_finalize();
|
if (gpio_read(GPIO_PORT_E, GPIO_PIN_4) == 0)
|
||||||
sdmmc_initialize();
|
{
|
||||||
init_done = true;
|
sdmmc_finalize();
|
||||||
|
sdmmc_initialize();
|
||||||
|
init_done = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sdmmc_finalize(void)
|
|
||||||
{
|
|
||||||
if (!sdmmc_storage_end(&sd_storage))
|
|
||||||
{
|
|
||||||
fatal_abort(Fatal_InitSD);
|
|
||||||
}
|
|
||||||
storageSDinitialized = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _file_based_update_filename(char *outFilename, u32 sd_path_len, u32 part_idx)
|
static void _file_based_update_filename(char *outFilename, u32 sd_path_len, u32 part_idx)
|
||||||
{
|
{
|
||||||
if (part_idx < 10)
|
snprintf(outFilename + sd_path_len, 3, "%02d", part_idx);
|
||||||
{
|
|
||||||
outFilename[sd_path_len] = '0';
|
|
||||||
itoa(part_idx, &outFilename[sd_path_len + 1], 10);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
itoa(part_idx, &outFilename[sd_path_len], 10);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _file_based_emmc_finalize(void)
|
static void _file_based_emmc_finalize(void)
|
||||||
@@ -108,11 +102,13 @@ static void _file_based_emmc_finalize(void)
|
|||||||
if ((emuMMC_ctx.EMMC_Type == emuMMC_SD_File) && fat_mounted)
|
if ((emuMMC_ctx.EMMC_Type == emuMMC_SD_File) && fat_mounted)
|
||||||
{
|
{
|
||||||
// Close all open handles.
|
// Close all open handles.
|
||||||
f_close(f_emu.fp_boot0);
|
f_close(&f_emu.fp_boot0);
|
||||||
f_close(f_emu.fp_boot1);
|
f_close(&f_emu.fp_boot1);
|
||||||
|
|
||||||
for (int i = 0; i < f_emu.parts; i++)
|
for (int i = 0; i < f_emu.parts; i++)
|
||||||
f_close(f_emu.fp_gpp[i]);
|
{
|
||||||
|
f_close(&f_emu.fp_gpp[i]);
|
||||||
|
}
|
||||||
|
|
||||||
// Force unmount FAT volume.
|
// Force unmount FAT volume.
|
||||||
f_mount(NULL, "", 1);
|
f_mount(NULL, "", 1);
|
||||||
@@ -121,6 +117,18 @@ static void _file_based_emmc_finalize(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sdmmc_finalize(void)
|
||||||
|
{
|
||||||
|
_file_based_emmc_finalize();
|
||||||
|
|
||||||
|
if (!sdmmc_storage_end(&sd_storage))
|
||||||
|
{
|
||||||
|
fatal_abort(Fatal_InitSD);
|
||||||
|
}
|
||||||
|
|
||||||
|
storageSDinitialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
static void _file_based_emmc_initialize(void)
|
static void _file_based_emmc_initialize(void)
|
||||||
{
|
{
|
||||||
char path[sizeof(emuMMC_ctx.storagePath) + 0x20];
|
char path[sizeof(emuMMC_ctx.storagePath) + 0x20];
|
||||||
@@ -128,40 +136,36 @@ static void _file_based_emmc_initialize(void)
|
|||||||
memset(&f_emu, 0, sizeof(file_based_ctxt));
|
memset(&f_emu, 0, sizeof(file_based_ctxt));
|
||||||
|
|
||||||
memcpy(path, (void *)emuMMC_ctx.storagePath, sizeof(emuMMC_ctx.storagePath));
|
memcpy(path, (void *)emuMMC_ctx.storagePath, sizeof(emuMMC_ctx.storagePath));
|
||||||
strcat(path, "/eMMC");
|
strcat(path, "/eMMC/");
|
||||||
int path_len = strlen(path);
|
int path_len = strlen(path);
|
||||||
|
|
||||||
// Open BOOT0 physical partition.
|
// Open BOOT0 physical partition.
|
||||||
f_emu.fp_boot0 = (FIL *)malloc(sizeof(FIL));
|
|
||||||
memcpy(path + path_len, "BOOT0", 6);
|
memcpy(path + path_len, "BOOT0", 6);
|
||||||
if (f_open(f_emu.fp_boot0, path, FA_READ | FA_WRITE) != FR_OK)
|
if (f_open(&f_emu.fp_boot0, path, FA_READ | FA_WRITE) != FR_OK)
|
||||||
fatal_abort(Fatal_InitSD);
|
fatal_abort(Fatal_InitSD);
|
||||||
|
|
||||||
// Open BOOT1 physical partition.
|
// Open BOOT1 physical partition.
|
||||||
f_emu.fp_boot1 = (FIL *)malloc(sizeof(FIL));
|
|
||||||
memcpy(path + path_len, "BOOT1", 6);
|
memcpy(path + path_len, "BOOT1", 6);
|
||||||
if (f_open(f_emu.fp_boot1, path, FA_READ | FA_WRITE) != FR_OK)
|
if (f_open(&f_emu.fp_boot1, path, FA_READ | FA_WRITE) != FR_OK)
|
||||||
fatal_abort(Fatal_InitSD);
|
fatal_abort(Fatal_InitSD);
|
||||||
|
|
||||||
// Open handles for GPP physical partition files.
|
// Open handles for GPP physical partition files.
|
||||||
_file_based_update_filename(path, path_len, 00);
|
_file_based_update_filename(path, path_len, 00);
|
||||||
if (f_open(f_emu.fp_gpp[0], path, FA_READ | FA_WRITE) != FR_OK)
|
|
||||||
|
if (f_open(&f_emu.fp_gpp[0], path, FA_READ | FA_WRITE) != FR_OK)
|
||||||
fatal_abort(Fatal_InitSD);
|
fatal_abort(Fatal_InitSD);
|
||||||
|
|
||||||
f_emu.part_size = f_size(f_emu.fp_gpp[0]);
|
f_emu.part_size = f_size(&f_emu.fp_gpp[0]) >> 9;
|
||||||
|
|
||||||
// Iterate folder for split parts and stop if next doesn't exist.
|
// Iterate folder for split parts and stop if next doesn't exist.
|
||||||
// Supports up to 32 parts of any size.
|
// Supports up to 32 parts of any size.
|
||||||
// TODO: decide on max parts and define them. (hekate produces up to 30 parts on 1GB mode.)
|
// TODO: decide on max parts and define them. (hekate produces up to 30 parts on 1GB mode.)
|
||||||
for (f_emu.parts = 1; f_emu.parts < 32; f_emu.parts++)
|
for (f_emu.parts = 1; f_emu.parts < 32; f_emu.parts++)
|
||||||
{
|
{
|
||||||
f_emu.fp_gpp[f_emu.parts] = (FIL *)malloc(sizeof(FIL));
|
|
||||||
_file_based_update_filename(path, path_len, f_emu.parts);
|
_file_based_update_filename(path, path_len, f_emu.parts);
|
||||||
|
|
||||||
if (f_open(f_emu.fp_gpp[f_emu.parts], path, FA_READ | FA_WRITE) != FR_OK)
|
if (f_open(&f_emu.fp_gpp[f_emu.parts], path, FA_READ | FA_WRITE) != FR_OK)
|
||||||
{
|
{
|
||||||
free(f_emu.fp_gpp[f_emu.parts]);
|
|
||||||
|
|
||||||
// Check if single file.
|
// Check if single file.
|
||||||
if (f_emu.parts == 1)
|
if (f_emu.parts == 1)
|
||||||
f_emu.parts = 0;
|
f_emu.parts = 0;
|
||||||
@@ -188,23 +192,33 @@ bool sdmmc_initialize(void)
|
|||||||
|
|
||||||
if (!storageSDinitialized)
|
if (!storageSDinitialized)
|
||||||
{
|
{
|
||||||
if (sdmmc_storage_init_sd(&sd_storage, &sd_sdmmc, SDMMC_1, SDMMC_BUS_WIDTH_4, 11))
|
int retries = 5;
|
||||||
|
while (retries)
|
||||||
{
|
{
|
||||||
storageSDinitialized = true;
|
if (sdmmc_storage_init_sd(&sd_storage, &sd_sdmmc, SDMMC_1, SDMMC_BUS_WIDTH_4, 11))
|
||||||
|
|
||||||
// File based emummc.
|
|
||||||
if ((emuMMC_ctx.EMMC_Type == emuMMC_SD_File) && !fat_mounted)
|
|
||||||
{
|
{
|
||||||
f_emu.sd_fs = (FATFS *)malloc(sizeof(FATFS));
|
storageSDinitialized = true;
|
||||||
if (f_mount(f_emu.sd_fs, "", 1) != FR_OK)
|
|
||||||
fatal_abort(Fatal_InitSD);
|
|
||||||
else
|
|
||||||
fat_mounted = true;
|
|
||||||
|
|
||||||
_file_based_emmc_initialize();
|
// File based emummc.
|
||||||
|
if ((emuMMC_ctx.EMMC_Type == emuMMC_SD_File) && !fat_mounted)
|
||||||
|
{
|
||||||
|
f_emu.sd_fs = (FATFS *)malloc(sizeof(FATFS));
|
||||||
|
if (f_mount(f_emu.sd_fs, "", 1) != FR_OK)
|
||||||
|
fatal_abort(Fatal_InitSD);
|
||||||
|
else
|
||||||
|
fat_mounted = true;
|
||||||
|
|
||||||
|
_file_based_emmc_initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
retries--;
|
||||||
|
msleep(100);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (!storageSDinitialized)
|
||||||
{
|
{
|
||||||
fatal_abort(Fatal_InitSD);
|
fatal_abort(Fatal_InitSD);
|
||||||
}
|
}
|
||||||
@@ -213,38 +227,6 @@ bool sdmmc_initialize(void)
|
|||||||
return storageMMCinitialized && storageSDinitialized;
|
return storageMMCinitialized && storageSDinitialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FS DMA calculations.
|
|
||||||
intptr_t sdmmc_calculate_dma_addr(sdmmc_accessor_t *_this, void *buf, unsigned int num_sectors)
|
|
||||||
{
|
|
||||||
int dma_buf_idx = 0;
|
|
||||||
char *_buf = (char *)buf;
|
|
||||||
char *actual_buf_start = _buf;
|
|
||||||
char *actual_buf_end = &_buf[512 * num_sectors];
|
|
||||||
char *dma_buffer_start = _this->parent->dmaBuffers[FS_SDMMC_EMMC].device_addr_buffer;
|
|
||||||
|
|
||||||
if (dma_buffer_start <= _buf && actual_buf_end <= &dma_buffer_start[_this->parent->dmaBuffers[FS_SDMMC_EMMC].device_addr_buffer_size])
|
|
||||||
{
|
|
||||||
dma_buf_idx = FS_SDMMC_EMMC;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dma_buffer_start = _this->parent->dmaBuffers[FS_SDMMC_SD].device_addr_buffer;
|
|
||||||
if (dma_buffer_start <= actual_buf_start && actual_buf_end <= &dma_buffer_start[_this->parent->dmaBuffers[FS_SDMMC_SD].device_addr_buffer_size])
|
|
||||||
{
|
|
||||||
dma_buf_idx = FS_SDMMC_SD;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dma_buffer_start = _this->parent->dmaBuffers[FS_SDMMC_GC].device_addr_buffer;
|
|
||||||
dma_buf_idx = FS_SDMMC_GC;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
intptr_t admaaddr = (intptr_t)&_this->parent->dmaBuffers[dma_buf_idx].device_addr_buffer_masked[actual_buf_start - dma_buffer_start];
|
|
||||||
|
|
||||||
return admaaddr;
|
|
||||||
}
|
|
||||||
|
|
||||||
sdmmc_accessor_t *sdmmc_accessor_get(int mmc_id)
|
sdmmc_accessor_t *sdmmc_accessor_get(int mmc_id)
|
||||||
{
|
{
|
||||||
sdmmc_accessor_t *_this;
|
sdmmc_accessor_t *_this;
|
||||||
@@ -268,14 +250,20 @@ sdmmc_accessor_t *sdmmc_accessor_get(int mmc_id)
|
|||||||
|
|
||||||
void mutex_lock_handler(int mmc_id)
|
void mutex_lock_handler(int mmc_id)
|
||||||
{
|
{
|
||||||
lock_mutex(sd_mutex);
|
if (custom_driver)
|
||||||
|
{
|
||||||
|
lock_mutex(sd_mutex);
|
||||||
|
}
|
||||||
lock_mutex(nand_mutex);
|
lock_mutex(nand_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mutex_unlock_handler(int mmc_id)
|
void mutex_unlock_handler(int mmc_id)
|
||||||
{
|
{
|
||||||
unlock_mutex(nand_mutex);
|
unlock_mutex(nand_mutex);
|
||||||
unlock_mutex(sd_mutex);
|
if (custom_driver)
|
||||||
|
{
|
||||||
|
unlock_mutex(sd_mutex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int sdmmc_nand_get_active_partition_index()
|
int sdmmc_nand_get_active_partition_index()
|
||||||
@@ -314,19 +302,19 @@ static uint64_t emummc_read_write_inner(void *buf, unsigned int sector, unsigned
|
|||||||
case FS_EMMC_PARTITION_GPP:
|
case FS_EMMC_PARTITION_GPP:
|
||||||
if (f_emu.parts)
|
if (f_emu.parts)
|
||||||
{
|
{
|
||||||
fp_tmp = f_emu.fp_gpp[sector / f_emu.part_size];
|
fp_tmp = &f_emu.fp_gpp[sector / f_emu.part_size];
|
||||||
sector = sector % f_emu.part_size;
|
sector = sector % f_emu.part_size;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fp_tmp = f_emu.fp_gpp[0];
|
fp_tmp = &f_emu.fp_gpp[0];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FS_EMMC_PARTITION_BOOT1:
|
case FS_EMMC_PARTITION_BOOT1:
|
||||||
fp_tmp = f_emu.fp_boot1;
|
fp_tmp = &f_emu.fp_boot1;
|
||||||
break;
|
break;
|
||||||
case FS_EMMC_PARTITION_BOOT0:
|
case FS_EMMC_PARTITION_BOOT0:
|
||||||
fp_tmp = f_emu.fp_boot0;
|
fp_tmp = &f_emu.fp_boot0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,10 +323,44 @@ static uint64_t emummc_read_write_inner(void *buf, unsigned int sector, unsigned
|
|||||||
; //TODO. Out of range. close stuff and fatal?
|
; //TODO. Out of range. close stuff and fatal?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t res = 0;
|
||||||
if (!is_write)
|
if (!is_write)
|
||||||
return !(f_read(fp_tmp, buf, num_sectors << 9, NULL));
|
res = !(f_read(fp_tmp, buf, num_sectors << 9, NULL));
|
||||||
else
|
else
|
||||||
return !(f_write(fp_tmp, buf, num_sectors << 9, NULL));
|
res = !(f_write(fp_tmp, buf, num_sectors << 9, NULL));
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Controller close wrapper
|
||||||
|
uint64_t sdmmc_wrapper_controller_close(int mmc_id)
|
||||||
|
{
|
||||||
|
sdmmc_accessor_t *_this;
|
||||||
|
_this = sdmmc_accessor_get(mmc_id);
|
||||||
|
|
||||||
|
if (_this != NULL)
|
||||||
|
{
|
||||||
|
if (mmc_id == FS_SDMMC_SD)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mmc_id == FS_SDMMC_EMMC)
|
||||||
|
{
|
||||||
|
// Close file handles and unmount
|
||||||
|
_file_based_emmc_finalize();
|
||||||
|
|
||||||
|
// Close SD
|
||||||
|
sdmmc_accessor_get(FS_SDMMC_SD)->vtab->sdmmc_accessor_controller_close(sdmmc_accessor_get(FS_SDMMC_SD));
|
||||||
|
|
||||||
|
// Close eMMC
|
||||||
|
return _this->vtab->sdmmc_accessor_controller_close(_this);
|
||||||
|
}
|
||||||
|
|
||||||
|
return _this->vtab->sdmmc_accessor_controller_close(_this);
|
||||||
|
}
|
||||||
|
|
||||||
|
fatal_abort(Fatal_CloseAccessor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FS read wrapper.
|
// FS read wrapper.
|
||||||
@@ -354,6 +376,8 @@ uint64_t sdmmc_wrapper_read(void *buf, uint64_t bufSize, int mmc_id, unsigned in
|
|||||||
if (mmc_id == FS_SDMMC_EMMC || mmc_id == FS_SDMMC_SD)
|
if (mmc_id == FS_SDMMC_EMMC || mmc_id == FS_SDMMC_SD)
|
||||||
{
|
{
|
||||||
mutex_lock_handler(mmc_id);
|
mutex_lock_handler(mmc_id);
|
||||||
|
// Assign FS accessor to the SDMMC driver
|
||||||
|
_current_accessor = _this;
|
||||||
// Make sure we're attached to the device address space.
|
// Make sure we're attached to the device address space.
|
||||||
_sdmmc_ensure_device_attached();
|
_sdmmc_ensure_device_attached();
|
||||||
// Make sure we're still initialized if boot killed sd card power.
|
// Make sure we're still initialized if boot killed sd card power.
|
||||||
@@ -362,8 +386,6 @@ uint64_t sdmmc_wrapper_read(void *buf, uint64_t bufSize, int mmc_id, unsigned in
|
|||||||
|
|
||||||
if (mmc_id == FS_SDMMC_EMMC)
|
if (mmc_id == FS_SDMMC_EMMC)
|
||||||
{
|
{
|
||||||
sd_storage.sdmmc->dma_addr_fs = (u64)sdmmc_calculate_dma_addr(_this, buf, num_sectors);
|
|
||||||
|
|
||||||
// Call hekates driver.
|
// Call hekates driver.
|
||||||
if (emummc_read_write_inner(buf, sector, num_sectors, false))
|
if (emummc_read_write_inner(buf, sector, num_sectors, false))
|
||||||
{
|
{
|
||||||
@@ -377,7 +399,17 @@ uint64_t sdmmc_wrapper_read(void *buf, uint64_t bufSize, int mmc_id, unsigned in
|
|||||||
|
|
||||||
if (mmc_id == FS_SDMMC_SD)
|
if (mmc_id == FS_SDMMC_SD)
|
||||||
{
|
{
|
||||||
sd_storage.sdmmc->dma_addr_fs = (u64)sdmmc_calculate_dma_addr(_this, buf, num_sectors);
|
static bool first_sd_read = true;
|
||||||
|
if (first_sd_read)
|
||||||
|
{
|
||||||
|
first_sd_read = false;
|
||||||
|
// Because some SD cards have issues with emuMMC's driver
|
||||||
|
// we currently swap to FS's driver after first SD read
|
||||||
|
// TODO: Fix remaining driver issues
|
||||||
|
custom_driver = false;
|
||||||
|
// FS will handle sd mutex w/o custom driver from here on
|
||||||
|
unlock_mutex(sd_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
// Call hekates driver.
|
// Call hekates driver.
|
||||||
if (sdmmc_storage_read(&sd_storage, sector, num_sectors, buf))
|
if (sdmmc_storage_read(&sd_storage, sector, num_sectors, buf))
|
||||||
@@ -410,8 +442,7 @@ uint64_t sdmmc_wrapper_write(int mmc_id, unsigned int sector, unsigned int num_s
|
|||||||
if (mmc_id == FS_SDMMC_EMMC)
|
if (mmc_id == FS_SDMMC_EMMC)
|
||||||
{
|
{
|
||||||
mutex_lock_handler(mmc_id);
|
mutex_lock_handler(mmc_id);
|
||||||
|
_current_accessor = _this;
|
||||||
sd_storage.sdmmc->dma_addr_fs = (u64)sdmmc_calculate_dma_addr(_this, buf, num_sectors);
|
|
||||||
|
|
||||||
// Call hekates driver.
|
// Call hekates driver.
|
||||||
if (emummc_read_write_inner(buf, sector, num_sectors, true))
|
if (emummc_read_write_inner(buf, sector, num_sectors, true))
|
||||||
@@ -427,9 +458,9 @@ uint64_t sdmmc_wrapper_write(int mmc_id, unsigned int sector, unsigned int num_s
|
|||||||
if (mmc_id == FS_SDMMC_SD)
|
if (mmc_id == FS_SDMMC_SD)
|
||||||
{
|
{
|
||||||
mutex_lock_handler(mmc_id);
|
mutex_lock_handler(mmc_id);
|
||||||
|
_current_accessor = _this;
|
||||||
|
|
||||||
sector += 0;
|
sector += 0;
|
||||||
sd_storage.sdmmc->dma_addr_fs = (u64)sdmmc_calculate_dma_addr(_this, buf, num_sectors);
|
|
||||||
|
|
||||||
// Call hekates driver.
|
// Call hekates driver.
|
||||||
if (sdmmc_storage_write(&sd_storage, sector, num_sectors, buf))
|
if (sdmmc_storage_write(&sd_storage, sector, num_sectors, buf))
|
||||||
|
|||||||
@@ -50,8 +50,8 @@ sdmmc_accessor_t *sdmmc_accessor_get(int mmc_id);
|
|||||||
void mutex_lock_handler(int mmc_id);
|
void mutex_lock_handler(int mmc_id);
|
||||||
void mutex_unlock_handler(int mmc_id);
|
void mutex_unlock_handler(int mmc_id);
|
||||||
|
|
||||||
intptr_t sdmmc_calculate_dma_addr(sdmmc_accessor_t *_this, void *buf, unsigned int num_sectors);
|
// Hooks
|
||||||
|
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);
|
||||||
|
|
||||||
@@ -61,9 +61,9 @@ typedef struct _file_based_ctxt
|
|||||||
uint64_t parts;
|
uint64_t parts;
|
||||||
uint64_t part_size;
|
uint64_t part_size;
|
||||||
FATFS *sd_fs;
|
FATFS *sd_fs;
|
||||||
FIL *fp_boot0;
|
FIL fp_boot0;
|
||||||
FIL *fp_boot1;
|
FIL fp_boot1;
|
||||||
FIL *fp_gpp[32];
|
FIL fp_gpp[32];
|
||||||
} file_based_ctxt;
|
} file_based_ctxt;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "nx/svc.h"
|
#include "nx/svc.h"
|
||||||
#include "nx/smc.h"
|
#include "nx/smc.h"
|
||||||
|
#include "soc/clock.h"
|
||||||
|
#include "soc/i2c.h"
|
||||||
#include "emuMMC/emummc.h"
|
#include "emuMMC/emummc.h"
|
||||||
#include "emuMMC/emummc_ctx.h"
|
#include "emuMMC/emummc_ctx.h"
|
||||||
#include "FS/FS_offsets.h"
|
#include "FS/FS_offsets.h"
|
||||||
@@ -40,7 +42,7 @@ uintptr_t text_base;
|
|||||||
char inner_heap[INNER_HEAP_SIZE];
|
char inner_heap[INNER_HEAP_SIZE];
|
||||||
size_t inner_heap_size = INNER_HEAP_SIZE;
|
size_t inner_heap_size = INNER_HEAP_SIZE;
|
||||||
extern char _start;
|
extern char _start;
|
||||||
extern char __injected_size__;
|
extern char __argdata__;
|
||||||
|
|
||||||
// Nintendo Path
|
// Nintendo Path
|
||||||
// TODO
|
// TODO
|
||||||
@@ -53,7 +55,7 @@ static char nintendo_path_contents_100[0x100] = "/Nintendo/Contents";
|
|||||||
static const fs_offsets_t *fs_offsets;
|
static const fs_offsets_t *fs_offsets;
|
||||||
|
|
||||||
// Defined by linkerscript
|
// Defined by linkerscript
|
||||||
#define INJECTED_SIZE ((uintptr_t)&__injected_size__ - (uintptr_t)&_start)
|
#define INJECTED_SIZE ((uintptr_t)&__argdata__ - (uintptr_t)&_start)
|
||||||
#define INJECT_OFFSET(type, offset) (type)(text_base + INJECTED_SIZE + offset)
|
#define INJECT_OFFSET(type, offset) (type)(text_base + INJECTED_SIZE + offset)
|
||||||
|
|
||||||
#define GENERATE_ADD(register, register_target, value) (0x91000000 | value << 10 | register << 5 | register_target)
|
#define GENERATE_ADD(register, register_target, value) (0x91000000 | value << 10 | register << 5 | register_target)
|
||||||
@@ -154,15 +156,14 @@ void write_nop(uintptr_t source)
|
|||||||
smcWriteAddress32((void *)source, GENERATE_NOP());
|
smcWriteAddress32((void *)source, GENERATE_NOP());
|
||||||
}
|
}
|
||||||
|
|
||||||
void write_adrp_add(int reg, uintptr_t pc, intptr_t destination)
|
void write_adrp_add(int reg, uintptr_t pc, uintptr_t add_rel_offset, intptr_t destination)
|
||||||
{
|
{
|
||||||
uintptr_t add_opcode_location = pc + sizeof(uint32_t);
|
uintptr_t add_opcode_location = pc + add_rel_offset;
|
||||||
|
|
||||||
intptr_t offset = (destination & 0xFFFFF000) - (pc & 0xFFFFF000);
|
intptr_t offset = (destination & 0xFFFFF000) - (pc & 0xFFFFF000);
|
||||||
uint32_t opcode_adrp = GENERATE_ADRP(reg, offset);
|
uint32_t opcode_adrp = GENERATE_ADRP(reg, offset);
|
||||||
uint32_t opcode_add = GENERATE_ADD(reg, reg, (destination & 0x00000FFF));
|
uint32_t opcode_add = GENERATE_ADD(reg, reg, (destination & 0x00000FFF));
|
||||||
|
|
||||||
// TODO: use 64 write?
|
|
||||||
smcWriteAddress32((void *)pc, opcode_adrp);
|
smcWriteAddress32((void *)pc, opcode_adrp);
|
||||||
smcWriteAddress32((void *)add_opcode_location, opcode_add);
|
smcWriteAddress32((void *)add_opcode_location, opcode_add);
|
||||||
}
|
}
|
||||||
@@ -175,6 +176,8 @@ 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_close hook
|
||||||
|
INJECT_HOOK(fs_offsets->sdmmc_accessor_controller_close, sdmmc_wrapper_controller_close);
|
||||||
|
|
||||||
// On 8.0.0+, we need to hook the regulator setup, because
|
// On 8.0.0+, we need to hook the regulator setup, because
|
||||||
// otherwise it will abort because we have already turned it on.
|
// otherwise it will abort because we have already turned it on.
|
||||||
@@ -204,10 +207,6 @@ void populate_function_pointers(void)
|
|||||||
|
|
||||||
void write_nops(void)
|
void write_nops(void)
|
||||||
{
|
{
|
||||||
// This NOPs out a call to ShutdownSdCard when preparing for shutdown/reboot.
|
|
||||||
// This prevents the PatrolReader from hanging when saving its state, which
|
|
||||||
// occurs immediately afterwards (in ShutdownMmc).
|
|
||||||
INJECT_NOP(fs_offsets->shutdown_sd);
|
|
||||||
// On 7.0.0+, we need to attach to device address space ourselves.
|
// On 7.0.0+, we need to attach to device address space ourselves.
|
||||||
// This patches an abort that happens when Nintendo's code sees SD
|
// This patches an abort that happens when Nintendo's code sees SD
|
||||||
// is already attached
|
// is already attached
|
||||||
@@ -268,7 +267,7 @@ void setup_nintendo_paths(void)
|
|||||||
{
|
{
|
||||||
intptr_t nintendo_path_location = (intptr_t)&nintendo_path;
|
intptr_t nintendo_path_location = (intptr_t)&nintendo_path;
|
||||||
uintptr_t fs_adrp_opcode_location = INJECT_OFFSET(uintptr_t, fs_offsets->nintendo_paths[i].adrp_offset);
|
uintptr_t fs_adrp_opcode_location = INJECT_OFFSET(uintptr_t, fs_offsets->nintendo_paths[i].adrp_offset);
|
||||||
write_adrp_add(fs_offsets->nintendo_paths[i].opcode_reg, fs_adrp_opcode_location, nintendo_path_location);
|
write_adrp_add(fs_offsets->nintendo_paths[i].opcode_reg, fs_adrp_opcode_location, fs_offsets->nintendo_paths[i].add_rel_offset, nintendo_path_location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -281,8 +280,8 @@ void setup_nintendo_paths(void)
|
|||||||
intptr_t album_path_location = nintendo_album_path_location + path_len - 6; // "/Album"
|
intptr_t album_path_location = nintendo_album_path_location + path_len - 6; // "/Album"
|
||||||
uintptr_t fs_n_adrp_opcode_location = INJECT_OFFSET(uintptr_t, fs_offsets->nintendo_paths[0].adrp_offset);
|
uintptr_t fs_n_adrp_opcode_location = INJECT_OFFSET(uintptr_t, fs_offsets->nintendo_paths[0].adrp_offset);
|
||||||
uintptr_t fs_adrp_opcode_location = INJECT_OFFSET(uintptr_t, fs_offsets->nintendo_paths[1].adrp_offset);
|
uintptr_t fs_adrp_opcode_location = INJECT_OFFSET(uintptr_t, fs_offsets->nintendo_paths[1].adrp_offset);
|
||||||
write_adrp_add(fs_offsets->nintendo_paths[0].opcode_reg, fs_n_adrp_opcode_location, nintendo_album_path_location);
|
write_adrp_add(fs_offsets->nintendo_paths[0].opcode_reg, fs_n_adrp_opcode_location, fs_offsets->nintendo_paths[0].add_rel_offset, nintendo_album_path_location);
|
||||||
write_adrp_add(fs_offsets->nintendo_paths[1].opcode_reg, fs_adrp_opcode_location, album_path_location);
|
write_adrp_add(fs_offsets->nintendo_paths[1].opcode_reg, fs_adrp_opcode_location, fs_offsets->nintendo_paths[1].add_rel_offset, album_path_location);
|
||||||
}
|
}
|
||||||
// Do contents path
|
// Do contents path
|
||||||
{
|
{
|
||||||
@@ -291,8 +290,8 @@ void setup_nintendo_paths(void)
|
|||||||
intptr_t contents_path_location = nintendo_contents_path_location + path_len - 9; // "/Contents"
|
intptr_t contents_path_location = nintendo_contents_path_location + path_len - 9; // "/Contents"
|
||||||
uintptr_t fs_n_adrp_opcode_location = INJECT_OFFSET(uintptr_t, fs_offsets->nintendo_paths[2].adrp_offset);
|
uintptr_t fs_n_adrp_opcode_location = INJECT_OFFSET(uintptr_t, fs_offsets->nintendo_paths[2].adrp_offset);
|
||||||
uintptr_t fs_adrp_opcode_location = INJECT_OFFSET(uintptr_t, fs_offsets->nintendo_paths[3].adrp_offset);
|
uintptr_t fs_adrp_opcode_location = INJECT_OFFSET(uintptr_t, fs_offsets->nintendo_paths[3].adrp_offset);
|
||||||
write_adrp_add(fs_offsets->nintendo_paths[2].opcode_reg, fs_n_adrp_opcode_location, nintendo_contents_path_location);
|
write_adrp_add(fs_offsets->nintendo_paths[2].opcode_reg, fs_n_adrp_opcode_location, fs_offsets->nintendo_paths[2].add_rel_offset, nintendo_contents_path_location);
|
||||||
write_adrp_add(fs_offsets->nintendo_paths[3].opcode_reg, fs_adrp_opcode_location, contents_path_location);
|
write_adrp_add(fs_offsets->nintendo_paths[3].opcode_reg, fs_adrp_opcode_location, fs_offsets->nintendo_paths[3].add_rel_offset, contents_path_location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -318,5 +317,6 @@ void __init()
|
|||||||
write_nops();
|
write_nops();
|
||||||
setup_nintendo_paths();
|
setup_nintendo_paths();
|
||||||
|
|
||||||
sdmmc_initialize();
|
clock_enable_i2c5();
|
||||||
|
i2c_init();
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -78,7 +78,7 @@ startup:
|
|||||||
|
|
||||||
MOV W0, #0xFFFF8001
|
MOV W0, #0xFFFF8001
|
||||||
ADR X1, __data_start
|
ADR X1, __data_start
|
||||||
ADR X2, __end__
|
ADR X2, __argdata__
|
||||||
SUB X2, X2, X1
|
SUB X2, X2, X1
|
||||||
MOV X3, #3
|
MOV X3, #3
|
||||||
SVC 0x73
|
SVC 0x73
|
||||||
@@ -127,5 +127,5 @@ bss_loop:
|
|||||||
MOV X30, X27
|
MOV X30, X27
|
||||||
|
|
||||||
# FS main
|
# FS main
|
||||||
ADR X16, __injected_size__
|
ADRP X16, __argdata__
|
||||||
BR X16
|
BR X16
|
||||||
|
|||||||
@@ -20,7 +20,8 @@
|
|||||||
#include "../utils/util.h"
|
#include "../utils/util.h"
|
||||||
#include "t210.h"
|
#include "t210.h"
|
||||||
|
|
||||||
static u32 i2c_addrs[] = {
|
// TODO: not hardcode I2C_5
|
||||||
|
static u64 i2c_addrs[] = {
|
||||||
0x7000C000, 0x7000C400, 0x7000C500,
|
0x7000C000, 0x7000C400, 0x7000C500,
|
||||||
0x7000C700, 0x7000D000, 0x7000D100
|
0x7000C700, 0x7000D000, 0x7000D100
|
||||||
};
|
};
|
||||||
@@ -28,6 +29,7 @@ static u32 i2c_addrs[] = {
|
|||||||
static void _i2c_wait(vu32 *base)
|
static void _i2c_wait(vu32 *base)
|
||||||
{
|
{
|
||||||
base[I2C_CONFIG_LOAD] = 0x25;
|
base[I2C_CONFIG_LOAD] = 0x25;
|
||||||
|
|
||||||
for (u32 i = 0; i < 20; i++)
|
for (u32 i = 0; i < 20; i++)
|
||||||
{
|
{
|
||||||
usleep(1);
|
usleep(1);
|
||||||
@@ -44,8 +46,7 @@ static int _i2c_send_pkt(u32 idx, u32 x, u8 *buf, u32 size)
|
|||||||
u32 tmp = 0;
|
u32 tmp = 0;
|
||||||
memcpy(&tmp, buf, size);
|
memcpy(&tmp, buf, size);
|
||||||
|
|
||||||
vu32 *base = (vu32 *)QueryIoMapping(i2c_addrs[0], 0x2000);
|
vu32 *base = (vu32 *)QueryIoMapping(i2c_addrs[I2C_5], 0x1000);
|
||||||
base = base + (i2c_addrs[idx] - i2c_addrs[0]);
|
|
||||||
base[I2C_CMD_ADDR0] = x << 1; //Set x (send mode).
|
base[I2C_CMD_ADDR0] = x << 1; //Set x (send mode).
|
||||||
base[I2C_CMD_DATA1] = tmp; //Set value.
|
base[I2C_CMD_DATA1] = tmp; //Set value.
|
||||||
base[I2C_CNFG] = (2 * size - 2) | 0x2800; //Set size and send mode.
|
base[I2C_CNFG] = (2 * size - 2) | 0x2800; //Set size and send mode.
|
||||||
@@ -66,8 +67,7 @@ static int _i2c_recv_pkt(u32 idx, u8 *buf, u32 size, u32 x)
|
|||||||
if (size > 8)
|
if (size > 8)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
vu32 *base = (vu32 *)QueryIoMapping(i2c_addrs[0], 0x2000);
|
vu32 *base = (vu32 *)QueryIoMapping(i2c_addrs[I2C_5], 0x1000);
|
||||||
base = base + (i2c_addrs[idx] - i2c_addrs[0]);
|
|
||||||
|
|
||||||
base[I2C_CMD_ADDR0] = (x << 1) | 1; // Set x (recv mode).
|
base[I2C_CMD_ADDR0] = (x << 1) | 1; // Set x (recv mode).
|
||||||
base[I2C_CNFG] = (size - 1) << 1 | 0x2840; // Set size and recv mode.
|
base[I2C_CNFG] = (size - 1) << 1 | 0x2840; // Set size and recv mode.
|
||||||
@@ -93,10 +93,9 @@ static int _i2c_recv_pkt(u32 idx, u8 *buf, u32 size, u32 x)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void i2c_init(u32 idx)
|
void i2c_init()
|
||||||
{
|
{
|
||||||
vu32 *base = (vu32 *)QueryIoMapping(i2c_addrs[0], 0x2000);
|
vu32 *base = (vu32 *)QueryIoMapping(i2c_addrs[I2C_5], 0x1000);
|
||||||
base = base + (i2c_addrs[idx] - i2c_addrs[0]);
|
|
||||||
|
|
||||||
base[I2C_CLK_DIVISOR_REGISTER] = 0x50001;
|
base[I2C_CLK_DIVISOR_REGISTER] = 0x50001;
|
||||||
base[I2C_BUS_CLEAR_CONFIG] = 0x90003;
|
base[I2C_BUS_CLEAR_CONFIG] = 0x90003;
|
||||||
@@ -104,7 +103,6 @@ void i2c_init(u32 idx)
|
|||||||
|
|
||||||
for (u32 i = 0; i < 10; i++)
|
for (u32 i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
usleep(20000);
|
|
||||||
if (base[INTERRUPT_STATUS_REGISTER] & 0x800)
|
if (base[INTERRUPT_STATUS_REGISTER] & 0x800)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
#define I2C_BUS_CLEAR_STATUS 0x22
|
#define I2C_BUS_CLEAR_STATUS 0x22
|
||||||
#define I2C_CONFIG_LOAD 0x23
|
#define I2C_CONFIG_LOAD 0x23
|
||||||
|
|
||||||
void i2c_init(u32 idx);
|
void i2c_init();
|
||||||
int i2c_send_buf_small(u32 idx, u32 x, u32 y, u8 *buf, u32 size);
|
int i2c_send_buf_small(u32 idx, u32 x, u32 y, u8 *buf, u32 size);
|
||||||
int i2c_recv_buf_small(u8 *buf, u32 size, u32 idx, u32 x, u32 y);
|
int i2c_recv_buf_small(u8 *buf, u32 size, u32 idx, u32 x, u32 y);
|
||||||
int i2c_send_byte(u32 idx, u32 x, u32 y, u8 b);
|
int i2c_send_byte(u32 idx, u32 x, u32 y, u8 b);
|
||||||
|
|||||||
@@ -15,13 +15,26 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include "fatal.h"
|
#include "fatal.h"
|
||||||
|
|
||||||
void __attribute__((noreturn)) fatal_abort(enum FatalReason abortReason)
|
void __attribute__((noreturn)) fatal_abort(enum FatalReason abortReason)
|
||||||
{
|
{
|
||||||
|
atmosphere_fatal_error_ctx error_ctx;
|
||||||
|
memset(&error_ctx, 0, sizeof(atmosphere_fatal_error_ctx));
|
||||||
|
|
||||||
|
// Basic error storage for Atmosphere
|
||||||
|
// TODO: Maybe include a small reboot2payload stub?
|
||||||
|
error_ctx.magic = ATMOSPHERE_REBOOT_TO_FATAL_MAGIC;
|
||||||
|
error_ctx.title_id = 0x0100000000000000; // FS
|
||||||
|
error_ctx.error_desc = abortReason;
|
||||||
|
|
||||||
|
// Copy fatal context
|
||||||
|
smcCopyToIram(ATMOSPHERE_FATAL_ERROR_ADDR, &error_ctx, sizeof(atmosphere_fatal_error_ctx));
|
||||||
|
|
||||||
// Reboot to RCM
|
// Reboot to RCM
|
||||||
smcRebootToRcm();
|
smcRebootToRcm();
|
||||||
|
|
||||||
while(true)
|
while (true)
|
||||||
; // Should never be reached
|
; // Should never be reached
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "../nx/smc.h"
|
#include "../nx/smc.h"
|
||||||
|
|
||||||
enum FatalReason {
|
enum FatalReason
|
||||||
|
{
|
||||||
Fatal_InitMMC = 0,
|
Fatal_InitMMC = 0,
|
||||||
Fatal_InitSD,
|
Fatal_InitSD,
|
||||||
Fatal_InvalidAccessor,
|
Fatal_InvalidAccessor,
|
||||||
@@ -28,7 +29,49 @@ enum FatalReason {
|
|||||||
Fatal_UnknownVersion,
|
Fatal_UnknownVersion,
|
||||||
Fatal_BadResult,
|
Fatal_BadResult,
|
||||||
Fatal_GetConfig,
|
Fatal_GetConfig,
|
||||||
|
Fatal_CloseAccessor,
|
||||||
Fatal_Max
|
Fatal_Max
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define AMS_FATAL_ERROR_MAX_STACKTRACE 0x20
|
||||||
|
#define AMS_FATAL_ERROR_MAX_STACKDUMP 0x100
|
||||||
|
|
||||||
|
/* Atmosphere reboot-to-fatal-error. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t magic;
|
||||||
|
uint32_t error_desc;
|
||||||
|
uint64_t title_id;
|
||||||
|
union {
|
||||||
|
uint64_t gprs[32];
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint64_t _gprs[29];
|
||||||
|
uint64_t fp;
|
||||||
|
uint64_t lr;
|
||||||
|
uint64_t sp;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
uint64_t pc;
|
||||||
|
uint64_t module_base;
|
||||||
|
uint32_t pstate;
|
||||||
|
uint32_t afsr0;
|
||||||
|
uint32_t afsr1;
|
||||||
|
uint32_t esr;
|
||||||
|
uint64_t far;
|
||||||
|
uint64_t report_identifier; /* Normally just system tick. */
|
||||||
|
uint64_t stack_trace_size;
|
||||||
|
uint64_t stack_dump_size;
|
||||||
|
uint64_t stack_trace[AMS_FATAL_ERROR_MAX_STACKTRACE];
|
||||||
|
uint8_t stack_dump[AMS_FATAL_ERROR_MAX_STACKDUMP];
|
||||||
|
} atmosphere_fatal_error_ctx;
|
||||||
|
|
||||||
|
/* "AFE1" */
|
||||||
|
#define ATMOSPHERE_REBOOT_TO_FATAL_MAGIC 0x31454641
|
||||||
|
/* "AFE0" */
|
||||||
|
#define ATMOSPHERE_REBOOT_TO_FATAL_MAGIC_0 0x30454641
|
||||||
|
|
||||||
|
#define ATMOSPHERE_FATAL_ERROR_ADDR 0x4003E000
|
||||||
|
#define ATMOSPHERE_FATAL_ERROR_CONTEXT ((volatile atmosphere_fatal_error_ctx *)(ATMOSPHERE_FATAL_ERROR_ADDR))
|
||||||
|
|
||||||
void __attribute__((noreturn)) fatal_abort(enum FatalReason abortReason);
|
void __attribute__((noreturn)) fatal_abort(enum FatalReason abortReason);
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
ParseClipboard()
|
ParseClipboard()
|
||||||
|
|
||||||
Func FormatLineData($sLineData)
|
Func FormatLineData($sLineData, $sLineDataAdd)
|
||||||
Local $lineData = StringReplace($sLineData, @TAB, " ")
|
Local $lineData = StringReplace($sLineData, @TAB, " ")
|
||||||
|
Local $lineDataADRP, $lineDataADD
|
||||||
Local $isADRP = false
|
Local $isADRP = false
|
||||||
$lineData = StringReplace($lineData, "Up o sub_71000" , "0x")
|
$lineData = StringReplace($lineData, "Up o sub_71000" , "0x")
|
||||||
$isADRP = StringInStr($lineData, "ADRP")
|
$isADRP = StringInStr($lineData, "ADRP")
|
||||||
@@ -13,24 +14,39 @@ Func FormatLineData($sLineData)
|
|||||||
|
|
||||||
$lineDataAddr = StringReplace($lineDataAddr, "0x" , "")
|
$lineDataAddr = StringReplace($lineDataAddr, "0x" , "")
|
||||||
$lineDataAddition = StringReplace($lineDataAddition, "0x" , "")
|
$lineDataAddition = StringReplace($lineDataAddition, "0x" , "")
|
||||||
|
$addrADRP = Dec($lineDataAddr) + Dec($lineDataAddition)
|
||||||
|
|
||||||
If $isADRP Then
|
$lineDataADRP = "0x" & Hex($addrADRP)
|
||||||
$lineData = "0x" & Hex(Dec($lineDataAddr) + Dec($lineDataAddition))
|
|
||||||
Else
|
|
||||||
Return ""
|
|
||||||
EndIf
|
|
||||||
|
|
||||||
Return "{.opcode_reg = " & $targetRegister & ", .adrp_offset = " & $lineData & "}, \" & @LF
|
Local $lineDataADD = StringReplace($sLineDataAdd, @TAB, " ")
|
||||||
|
Local $isADD = false
|
||||||
|
$lineDataADD = StringReplace($lineDataADD, "Up o sub_71000" , "0x")
|
||||||
|
$isADD = StringInStr($lineData, "ADD")
|
||||||
|
|
||||||
|
$lineDataADD = StringSplit($lineDataADD, " ")[1]
|
||||||
|
$lineDataAddAddr = StringSplit($lineDataADD, "+")[1]
|
||||||
|
$lineDataAddAddition = StringSplit($lineDataADD, "+")[2]
|
||||||
|
|
||||||
|
$lineDataAddAddr = StringReplace($lineDataAddAddr, "0x" , "")
|
||||||
|
$lineDataAddAddition = StringReplace($lineDataAddAddition, "0x" , "")
|
||||||
|
$addrADD = Dec($lineDataAddAddr) + Dec($lineDataAddAddition)
|
||||||
|
$addrADD = $addrADD - $addrADRP
|
||||||
|
$lineDataADD = "0x" & Hex($addrADD)
|
||||||
|
|
||||||
|
Return @TAB & "{.opcode_reg = " & $targetRegister & ", .adrp_offset = " & $lineDataADRP & ", .add_rel_offset = " & $lineDataADD & "}, \" & @LF
|
||||||
EndFunc
|
EndFunc
|
||||||
|
|
||||||
Func ParseClipboard()
|
Func ParseClipboard()
|
||||||
Local $sData = ClipGet()
|
Local $sData = ClipGet()
|
||||||
Local $oData = ""
|
Local $oData = ""
|
||||||
Local $sLineData = StringSplit(StringReplace($sData, @CRLF, @LF), @LF)
|
Local $sLineData = StringSplit(StringReplace($sData, @CRLF, @LF), @LF)
|
||||||
For $i = 2 to UBound($sLineData) - 2
|
For $i = 2 to UBound($sLineData) - 2 Step 2
|
||||||
Local $lineData = FormatLineData($sLineData[$i])
|
Local $lineData = FormatLineData($sLineData[$i], $sLineData[$i+1])
|
||||||
;ConsoleWrite($lineData)
|
;ConsoleWrite($lineData)
|
||||||
$oData = $oData & $lineData
|
$oData = $oData & $lineData
|
||||||
Next
|
Next
|
||||||
|
|
||||||
|
$oData = "{ \" & @LF & $oData & @TAB & "{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \" & @LF & "}" & @LF
|
||||||
|
;ConsoleWrite($oData)
|
||||||
ClipPut($oData)
|
ClipPut($oData)
|
||||||
EndFunc
|
EndFunc
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ TARGET := $(notdir $(CURDIR))
|
|||||||
BUILD := build
|
BUILD := build
|
||||||
SOURCES := src src/dbg
|
SOURCES := src src/dbg
|
||||||
DATA := data
|
DATA := data
|
||||||
INCLUDES := include ../common/include
|
INCLUDES := include ../libraries/libvapours/include
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
# options for code generation
|
# options for code generation
|
||||||
@@ -48,7 +48,7 @@ CFLAGS := \
|
|||||||
-Wall \
|
-Wall \
|
||||||
$(ARCH) $(DEFINES)
|
$(ARCH) $(DEFINES)
|
||||||
|
|
||||||
CFLAGS += $(INCLUDE)
|
CFLAGS += $(INCLUDE)
|
||||||
|
|
||||||
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
|
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ TARGET := $(notdir $(CURDIR))
|
|||||||
BUILD := build
|
BUILD := build
|
||||||
SOURCES := src
|
SOURCES := src
|
||||||
DATA := data
|
DATA := data
|
||||||
INCLUDES := include ../../common/include
|
INCLUDES := include ../../libraries/libvapours/include
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
# options for code generation
|
# options for code generation
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ typedef enum {
|
|||||||
CARDEVICE_UARTC = ((1 << 5) | 0x17),
|
CARDEVICE_UARTC = ((1 << 5) | 0x17),
|
||||||
CARDEVICE_I2C1 = ((0 << 5) | 0xC),
|
CARDEVICE_I2C1 = ((0 << 5) | 0xC),
|
||||||
CARDEVICE_I2C5 = ((1 << 5) | 0xF),
|
CARDEVICE_I2C5 = ((1 << 5) | 0xF),
|
||||||
CARDEVICE_UNK = ((3 << 5) | 0x1E),
|
CARDEVICE_TZRAM = ((3 << 5) | 0x1E),
|
||||||
CARDEVICE_SE = ((3 << 5) | 0x1F),
|
CARDEVICE_SE = ((3 << 5) | 0x1F),
|
||||||
CARDEVICE_HOST1X = ((0 << 5) | 0x1C),
|
CARDEVICE_HOST1X = ((0 << 5) | 0x1C),
|
||||||
CARDEVICE_TSEC = ((2 << 5) | 0x13),
|
CARDEVICE_TSEC = ((2 << 5) | 0x13),
|
||||||
|
|||||||
@@ -35,6 +35,14 @@
|
|||||||
#define MC_SMMU_PTB_DATA 0x20
|
#define MC_SMMU_PTB_DATA 0x20
|
||||||
#define MC_SMMU_TLB_FLUSH 0x30
|
#define MC_SMMU_TLB_FLUSH 0x30
|
||||||
#define MC_SMMU_PTC_FLUSH 0x34
|
#define MC_SMMU_PTC_FLUSH 0x34
|
||||||
|
#define MC_SMMU_ASID_SECURITY 0x38
|
||||||
|
#define MC_SMMU_ASID_SECURITY_1 0x3c
|
||||||
|
#define MC_SMMU_ASID_SECURITY_2 0x9e0
|
||||||
|
#define MC_SMMU_ASID_SECURITY_3 0x9e4
|
||||||
|
#define MC_SMMU_ASID_SECURITY_4 0x9e8
|
||||||
|
#define MC_SMMU_ASID_SECURITY_5 0x9ec
|
||||||
|
#define MC_SMMU_ASID_SECURITY_6 0x9f0
|
||||||
|
#define MC_SMMU_ASID_SECURITY_7 0x9f4
|
||||||
#define MC_SMMU_AFI_ASID 0x238
|
#define MC_SMMU_AFI_ASID 0x238
|
||||||
#define MC_SMMU_AVPC_ASID 0x23c
|
#define MC_SMMU_AVPC_ASID 0x23c
|
||||||
#define MC_SMMU_PPCS1_ASID 0x298
|
#define MC_SMMU_PPCS1_ASID 0x298
|
||||||
|
|||||||
@@ -13,14 +13,14 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EXOSPHERE_WARMBOOT_BIN_UTILS_H
|
#ifndef EXOSPHERE_WARMBOOT_BIN_UTILS_H
|
||||||
#define EXOSPHERE_WARMBOOT_BIN_UTILS_H
|
#define EXOSPHERE_WARMBOOT_BIN_UTILS_H
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <atmosphere.h>
|
#include <vapours/ams_version.h>
|
||||||
|
|
||||||
#define BIT(n) (1u << (n))
|
#define BIT(n) (1u << (n))
|
||||||
#define BITL(n) (1ull << (n))
|
#define BITL(n) (1ull << (n))
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ void setup_dram_magic_numbers(void) {
|
|||||||
void bootup_misc_mmio(void) {
|
void bootup_misc_mmio(void) {
|
||||||
/* Initialize Fuse registers. */
|
/* Initialize Fuse registers. */
|
||||||
fuse_init();
|
fuse_init();
|
||||||
|
|
||||||
/* Verify Security Engine sanity. */
|
/* Verify Security Engine sanity. */
|
||||||
se_set_in_context_save_mode(false);
|
se_set_in_context_save_mode(false);
|
||||||
/* TODO: se_verify_keys_unreadable(); */
|
/* TODO: se_verify_keys_unreadable(); */
|
||||||
@@ -85,6 +85,9 @@ void bootup_misc_mmio(void) {
|
|||||||
setup_dram_magic_numbers();
|
setup_dram_magic_numbers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* On 9.0.0+, Nintendo writes random values to context save scratch here, and locks the SRK scratch. */
|
||||||
|
/* There's no real need for us to do this, so we won't. */
|
||||||
|
|
||||||
/* Mark TMR5, TMR6, TMR7, TMR8, WDT0, WDT1, WDT2 and WDT3 as secure. */
|
/* Mark TMR5, TMR6, TMR7, TMR8, WDT0, WDT1, WDT2 and WDT3 as secure. */
|
||||||
SHARED_TIMER_SECURE_CFG_0 = 0xF1E0;
|
SHARED_TIMER_SECURE_CFG_0 = 0xF1E0;
|
||||||
|
|
||||||
@@ -111,7 +114,7 @@ void bootup_misc_mmio(void) {
|
|||||||
MAKE_MC_REG(MC_SECURITY_CFG1) = 0;
|
MAKE_MC_REG(MC_SECURITY_CFG1) = 0;
|
||||||
MAKE_MC_REG(MC_SECURITY_CFG3) = 3;
|
MAKE_MC_REG(MC_SECURITY_CFG3) = 3;
|
||||||
configure_default_carveouts();
|
configure_default_carveouts();
|
||||||
|
|
||||||
/* Mark registers secure world only. */
|
/* Mark registers secure world only. */
|
||||||
if (exosphere_get_target_firmware() == ATMOSPHERE_TARGET_FIRMWARE_100) {
|
if (exosphere_get_target_firmware() == ATMOSPHERE_TARGET_FIRMWARE_100) {
|
||||||
APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0 = APB_SSER0_SATA_AUX | APB_SSER0_DTV | APB_SSER0_QSPI | APB_SSER0_SATA | APB_SSER0_LA;
|
APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0 = APB_SSER0_SATA_AUX | APB_SSER0_DTV | APB_SSER0_QSPI | APB_SSER0_SATA | APB_SSER0_LA;
|
||||||
@@ -140,28 +143,26 @@ void bootup_misc_mmio(void) {
|
|||||||
APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG2_0 = sec_disable_2;
|
APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG2_0 = sec_disable_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reset Translation Enable Registers. */
|
/* Reset Translation Enable registers. */
|
||||||
MAKE_MC_REG(MC_SMMU_TRANSLATION_ENABLE_0) = 0xFFFFFFFF;
|
MAKE_MC_REG(MC_SMMU_TRANSLATION_ENABLE_0) = 0xFFFFFFFF;
|
||||||
MAKE_MC_REG(MC_SMMU_TRANSLATION_ENABLE_1) = 0xFFFFFFFF;
|
MAKE_MC_REG(MC_SMMU_TRANSLATION_ENABLE_1) = 0xFFFFFFFF;
|
||||||
MAKE_MC_REG(MC_SMMU_TRANSLATION_ENABLE_2) = 0xFFFFFFFF;
|
MAKE_MC_REG(MC_SMMU_TRANSLATION_ENABLE_2) = 0xFFFFFFFF;
|
||||||
MAKE_MC_REG(MC_SMMU_TRANSLATION_ENABLE_3) = 0xFFFFFFFF;
|
MAKE_MC_REG(MC_SMMU_TRANSLATION_ENABLE_3) = 0xFFFFFFFF;
|
||||||
MAKE_MC_REG(MC_SMMU_TRANSLATION_ENABLE_4) = 0xFFFFFFFF;
|
MAKE_MC_REG(MC_SMMU_TRANSLATION_ENABLE_4) = 0xFFFFFFFF;
|
||||||
|
|
||||||
/* TODO: What are these MC reg writes? */
|
/* Set SMMU ASID security registers. */
|
||||||
if (exosphere_get_target_firmware() >= ATMOSPHERE_TARGET_FIRMWARE_400) {
|
if (exosphere_get_target_firmware() >= ATMOSPHERE_TARGET_FIRMWARE_400) {
|
||||||
MAKE_MC_REG(0x038) = 0xE;
|
MAKE_MC_REG(MC_SMMU_ASID_SECURITY) = 0xE;
|
||||||
} else {
|
} else {
|
||||||
MAKE_MC_REG(0x038) = 0x0;
|
MAKE_MC_REG(MC_SMMU_ASID_SECURITY) = 0x0;
|
||||||
}
|
}
|
||||||
MAKE_MC_REG(0x03C) = 0;
|
MAKE_MC_REG(MC_SMMU_ASID_SECURITY_1) = 0;
|
||||||
|
MAKE_MC_REG(MC_SMMU_ASID_SECURITY_2) = 0;
|
||||||
/* MISC registers. */
|
MAKE_MC_REG(MC_SMMU_ASID_SECURITY_3) = 0;
|
||||||
MAKE_MC_REG(0x9E0) = 0;
|
MAKE_MC_REG(MC_SMMU_ASID_SECURITY_4) = 0;
|
||||||
MAKE_MC_REG(0x9E4) = 0;
|
MAKE_MC_REG(MC_SMMU_ASID_SECURITY_5) = 0;
|
||||||
MAKE_MC_REG(0x9E8) = 0;
|
MAKE_MC_REG(MC_SMMU_ASID_SECURITY_6) = 0;
|
||||||
MAKE_MC_REG(0x9EC) = 0;
|
MAKE_MC_REG(MC_SMMU_ASID_SECURITY_7) = 0;
|
||||||
MAKE_MC_REG(0x9F0) = 0;
|
|
||||||
MAKE_MC_REG(0x9F4) = 0;
|
|
||||||
|
|
||||||
if (exosphere_get_target_firmware() >= ATMOSPHERE_TARGET_FIRMWARE_400) {
|
if (exosphere_get_target_firmware() >= ATMOSPHERE_TARGET_FIRMWARE_400) {
|
||||||
MAKE_MC_REG(MC_SMMU_PTB_ASID) = 0;
|
MAKE_MC_REG(MC_SMMU_PTB_ASID) = 0;
|
||||||
@@ -176,7 +177,7 @@ void bootup_misc_mmio(void) {
|
|||||||
(void)MAKE_MC_REG(MC_SMMU_TLB_CONFIG);
|
(void)MAKE_MC_REG(MC_SMMU_TLB_CONFIG);
|
||||||
MAKE_MC_REG(MC_SMMU_CONFIG) = 1; /* Enable SMMU. */
|
MAKE_MC_REG(MC_SMMU_CONFIG) = 1; /* Enable SMMU. */
|
||||||
(void)MAKE_MC_REG(MC_SMMU_TLB_CONFIG);
|
(void)MAKE_MC_REG(MC_SMMU_TLB_CONFIG);
|
||||||
|
|
||||||
/* Clear RESET Vector, setup CPU Secure Boot RESET Vectors. */
|
/* Clear RESET Vector, setup CPU Secure Boot RESET Vectors. */
|
||||||
uint32_t reset_vec;
|
uint32_t reset_vec;
|
||||||
if (exosphere_get_target_firmware() >= ATMOSPHERE_TARGET_FIRMWARE_500) {
|
if (exosphere_get_target_firmware() >= ATMOSPHERE_TARGET_FIRMWARE_500) {
|
||||||
@@ -204,7 +205,7 @@ void bootup_misc_mmio(void) {
|
|||||||
intr_set_enabled(INTERRUPT_ID_SECURITY_ENGINE, 1);
|
intr_set_enabled(INTERRUPT_ID_SECURITY_ENGINE, 1);
|
||||||
intr_set_cpu_mask(INTERRUPT_ID_SECURITY_ENGINE, 8);
|
intr_set_cpu_mask(INTERRUPT_ID_SECURITY_ENGINE, 8);
|
||||||
intr_set_edge_level(INTERRUPT_ID_SECURITY_ENGINE, 0);
|
intr_set_edge_level(INTERRUPT_ID_SECURITY_ENGINE, 0);
|
||||||
|
|
||||||
if (exosphere_get_target_firmware() >= ATMOSPHERE_TARGET_FIRMWARE_400) {
|
if (exosphere_get_target_firmware() >= ATMOSPHERE_TARGET_FIRMWARE_400) {
|
||||||
intr_set_priority(INTERRUPT_ID_ACTIVITY_MONITOR_4X, 0);
|
intr_set_priority(INTERRUPT_ID_ACTIVITY_MONITOR_4X, 0);
|
||||||
intr_set_group(INTERRUPT_ID_ACTIVITY_MONITOR_4X, 0);
|
intr_set_group(INTERRUPT_ID_ACTIVITY_MONITOR_4X, 0);
|
||||||
@@ -215,10 +216,10 @@ void bootup_misc_mmio(void) {
|
|||||||
|
|
||||||
if (!g_has_booted_up) {
|
if (!g_has_booted_up) {
|
||||||
/* N doesn't do this, but we should for compatibility. */
|
/* N doesn't do this, but we should for compatibility. */
|
||||||
uart_select(UART_A);
|
uart_config(UART_A);
|
||||||
clkrst_reboot(CARDEVICE_UARTA);
|
clkrst_reboot(CARDEVICE_UARTA);
|
||||||
uart_init(UART_A, 115200);
|
uart_init(UART_A, 115200);
|
||||||
|
|
||||||
intr_register_handler(INTERRUPT_ID_SECURITY_ENGINE, se_operation_completed);
|
intr_register_handler(INTERRUPT_ID_SECURITY_ENGINE, se_operation_completed);
|
||||||
if (exosphere_get_target_firmware() >= ATMOSPHERE_TARGET_FIRMWARE_400) {
|
if (exosphere_get_target_firmware() >= ATMOSPHERE_TARGET_FIRMWARE_400) {
|
||||||
intr_register_handler(INTERRUPT_ID_ACTIVITY_MONITOR_4X, actmon_interrupt_handler);
|
intr_register_handler(INTERRUPT_ID_ACTIVITY_MONITOR_4X, actmon_interrupt_handler);
|
||||||
|
|||||||
@@ -13,9 +13,9 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <atmosphere/version.h>
|
#include <vapours/ams_version.h>
|
||||||
|
|
||||||
#include "bootconfig.h"
|
#include "bootconfig.h"
|
||||||
#include "configitem.h"
|
#include "configitem.h"
|
||||||
@@ -38,6 +38,7 @@
|
|||||||
static bool g_hiz_mode_enabled = false;
|
static bool g_hiz_mode_enabled = false;
|
||||||
static bool g_debugmode_override_user = false, g_debugmode_override_priv = false;
|
static bool g_debugmode_override_user = false, g_debugmode_override_priv = false;
|
||||||
static bool g_enable_usermode_exception_handlers = true;
|
static bool g_enable_usermode_exception_handlers = true;
|
||||||
|
static bool g_enable_usermode_pmu_access = false;
|
||||||
|
|
||||||
uint32_t configitem_set(bool privileged, ConfigItem item, uint64_t value) {
|
uint32_t configitem_set(bool privileged, ConfigItem item, uint64_t value) {
|
||||||
switch (item) {
|
switch (item) {
|
||||||
@@ -63,14 +64,14 @@ uint32_t configitem_set(bool privileged, ConfigItem item, uint64_t value) {
|
|||||||
/* Set SVC handler to jump to reboot stub in IRAM. */
|
/* Set SVC handler to jump to reboot stub in IRAM. */
|
||||||
MAKE_REG32(MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_RTC_PMC) + 0x520ull) = 0x4003F000;
|
MAKE_REG32(MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_RTC_PMC) + 0x520ull) = 0x4003F000;
|
||||||
MAKE_REG32(MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_RTC_PMC) + 0x53Cull) = 0x6000F208;
|
MAKE_REG32(MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_RTC_PMC) + 0x53Cull) = 0x6000F208;
|
||||||
|
|
||||||
/* Copy reboot stub payload. */
|
/* Copy reboot stub payload. */
|
||||||
ams_map_irampage(0x4003F000);
|
ams_map_irampage(0x4003F000);
|
||||||
for (unsigned int i = 0; i < rebootstub_bin_size; i += 4) {
|
for (unsigned int i = 0; i < rebootstub_bin_size; i += 4) {
|
||||||
MAKE_REG32(MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_AMS_IRAM_PAGE) + i) = read32le(rebootstub_bin, i);
|
MAKE_REG32(MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_AMS_IRAM_PAGE) + i) = read32le(rebootstub_bin, i);
|
||||||
}
|
}
|
||||||
ams_unmap_irampage();
|
ams_unmap_irampage();
|
||||||
|
|
||||||
/* Ensure stub is flushed. */
|
/* Ensure stub is flushed. */
|
||||||
flush_dcache_all();
|
flush_dcache_all();
|
||||||
break;
|
break;
|
||||||
@@ -95,7 +96,7 @@ uint32_t configitem_set(bool privileged, ConfigItem item, uint64_t value) {
|
|||||||
/* Set SVC handler to jump to reboot stub in IRAM. */
|
/* Set SVC handler to jump to reboot stub in IRAM. */
|
||||||
MAKE_REG32(MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_RTC_PMC) + 0x520ull) = 0x4003F000;
|
MAKE_REG32(MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_RTC_PMC) + 0x520ull) = 0x4003F000;
|
||||||
MAKE_REG32(MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_RTC_PMC) + 0x53Cull) = 0x6000F208;
|
MAKE_REG32(MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_RTC_PMC) + 0x53Cull) = 0x6000F208;
|
||||||
|
|
||||||
/* Copy reboot stub payload. */
|
/* Copy reboot stub payload. */
|
||||||
ams_map_irampage(0x4003F000);
|
ams_map_irampage(0x4003F000);
|
||||||
for (unsigned int i = 0; i < rebootstub_bin_size; i += 4) {
|
for (unsigned int i = 0; i < rebootstub_bin_size; i += 4) {
|
||||||
@@ -104,7 +105,7 @@ uint32_t configitem_set(bool privileged, ConfigItem item, uint64_t value) {
|
|||||||
/* Tell rebootstub to shut down. */
|
/* Tell rebootstub to shut down. */
|
||||||
MAKE_REG32(MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_AMS_IRAM_PAGE) + 0x10) = 0x0;
|
MAKE_REG32(MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_AMS_IRAM_PAGE) + 0x10) = 0x0;
|
||||||
ams_unmap_irampage();
|
ams_unmap_irampage();
|
||||||
|
|
||||||
MAKE_REG32(MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_RTC_PMC) + 0x400ull) = 0x10;
|
MAKE_REG32(MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_RTC_PMC) + 0x400ull) = 0x10;
|
||||||
while (1) { }
|
while (1) { }
|
||||||
}
|
}
|
||||||
@@ -112,7 +113,7 @@ uint32_t configitem_set(bool privileged, ConfigItem item, uint64_t value) {
|
|||||||
default:
|
default:
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,6 +169,10 @@ void configitem_disable_usermode_exception_handlers(void) {
|
|||||||
g_enable_usermode_exception_handlers = false;
|
g_enable_usermode_exception_handlers = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void configitem_enable_usermode_pmu_access(void) {
|
||||||
|
g_enable_usermode_pmu_access = true;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t configitem_get(bool privileged, ConfigItem item, uint64_t *p_outvalue) {
|
uint32_t configitem_get(bool privileged, ConfigItem item, uint64_t *p_outvalue) {
|
||||||
uint32_t result = 0;
|
uint32_t result = 0;
|
||||||
switch (item) {
|
switch (item) {
|
||||||
@@ -222,6 +227,10 @@ uint32_t configitem_get(bool privileged, ConfigItem item, uint64_t *p_outvalue)
|
|||||||
if (g_enable_usermode_exception_handlers) {
|
if (g_enable_usermode_exception_handlers) {
|
||||||
config |= KERNELCONFIGFLAG_ENABLE_USER_EXCEPTION_HANDLERS;
|
config |= KERNELCONFIGFLAG_ENABLE_USER_EXCEPTION_HANDLERS;
|
||||||
}
|
}
|
||||||
|
/* Allow for enabling usermode pmu access. */
|
||||||
|
if (g_enable_usermode_pmu_access) {
|
||||||
|
config |= KERNELCONFIGFLAG_ENABLE_USER_PMU_ACCESS;
|
||||||
|
}
|
||||||
*p_outvalue = config;
|
*p_outvalue = config;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -262,7 +271,7 @@ uint32_t configitem_get(bool privileged, ConfigItem item, uint64_t *p_outvalue)
|
|||||||
break;
|
break;
|
||||||
case CONFIGITEM_EXOSPHERE_VERSION:
|
case CONFIGITEM_EXOSPHERE_VERSION:
|
||||||
/* UNOFFICIAL: Gets information about the current exosphere version. */
|
/* UNOFFICIAL: Gets information about the current exosphere version. */
|
||||||
*p_outvalue = ((uint64_t)(ATMOSPHERE_RELEASE_VERSION_MAJOR & 0xFF) << 32ull) |
|
*p_outvalue = ((uint64_t)(ATMOSPHERE_RELEASE_VERSION_MAJOR & 0xFF) << 32ull) |
|
||||||
((uint64_t)(ATMOSPHERE_RELEASE_VERSION_MINOR & 0xFF) << 24ull) |
|
((uint64_t)(ATMOSPHERE_RELEASE_VERSION_MINOR & 0xFF) << 24ull) |
|
||||||
((uint64_t)(ATMOSPHERE_RELEASE_VERSION_MICRO & 0xFF) << 16ull) |
|
((uint64_t)(ATMOSPHERE_RELEASE_VERSION_MICRO & 0xFF) << 16ull) |
|
||||||
((uint64_t)(exosphere_get_target_firmware() & 0xFF) << 8ull) |
|
((uint64_t)(exosphere_get_target_firmware() & 0xFF) << 8ull) |
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EXOSPHERE_CFG_ITEM_H
|
#ifndef EXOSPHERE_CFG_ITEM_H
|
||||||
#define EXOSPHERE_CFG_ITEM_H
|
#define EXOSPHERE_CFG_ITEM_H
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ typedef enum {
|
|||||||
CONFIGITEM_NEWHARDWARETYPE_5X = 15,
|
CONFIGITEM_NEWHARDWARETYPE_5X = 15,
|
||||||
CONFIGITEM_NEWKEYGENERATION_5X = 16,
|
CONFIGITEM_NEWKEYGENERATION_5X = 16,
|
||||||
CONFIGITEM_PACKAGE2HASH_5X = 17,
|
CONFIGITEM_PACKAGE2HASH_5X = 17,
|
||||||
|
|
||||||
/* These are unofficial, for usage by Exosphere. */
|
/* These are unofficial, for usage by Exosphere. */
|
||||||
CONFIGITEM_EXOSPHERE_VERSION = 65000,
|
CONFIGITEM_EXOSPHERE_VERSION = 65000,
|
||||||
CONFIGITEM_NEEDS_REBOOT = 65001,
|
CONFIGITEM_NEEDS_REBOOT = 65001,
|
||||||
@@ -61,6 +61,7 @@ bool configitem_is_debugmode_priv(void);
|
|||||||
|
|
||||||
void configitem_set_debugmode_override(bool user, bool priv);
|
void configitem_set_debugmode_override(bool user, bool priv);
|
||||||
void configitem_disable_usermode_exception_handlers(void);
|
void configitem_disable_usermode_exception_handlers(void);
|
||||||
|
void configitem_enable_usermode_pmu_access(void);
|
||||||
void configitem_set_hiz_mode_enabled(bool enabled);
|
void configitem_set_hiz_mode_enabled(bool enabled);
|
||||||
|
|
||||||
uint64_t configitem_get_hardware_type(void);
|
uint64_t configitem_get_hardware_type(void);
|
||||||
|
|||||||
@@ -13,12 +13,12 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EXOSPHERE_EMUMMC_CONFIG_H
|
#ifndef EXOSPHERE_EMUMMC_CONFIG_H
|
||||||
#define EXOSPHERE_EMUMMC_CONFIG_H
|
#define EXOSPHERE_EMUMMC_CONFIG_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <atmosphere.h>
|
#include <vapours/ams_version.h>
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
/* "EFS0" */
|
/* "EFS0" */
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
#include "mmu.h"
|
#include "mmu.h"
|
||||||
#include "memory_map.h"
|
#include "memory_map.h"
|
||||||
|
|
||||||
static exosphere_config_t g_exosphere_cfg = {MAGIC_EXOSPHERE_CONFIG, ATMOSPHERE_TARGET_FIRMWARE_DEFAULT_FOR_DEBUG, EXOSPHERE_FLAGS_DEFAULT};
|
static exosphere_config_t g_exosphere_cfg = {MAGIC_EXOSPHERE_CONFIG, ATMOSPHERE_TARGET_FIRMWARE_CURRENT, EXOSPHERE_FLAGS_DEFAULT};
|
||||||
static bool g_has_loaded_config = false;
|
static bool g_has_loaded_config = false;
|
||||||
|
|
||||||
#define EXOSPHERE_CHECK_FLAG(flag) ((g_exosphere_cfg.flags & flag) != 0)
|
#define EXOSPHERE_CHECK_FLAG(flag) ((g_exosphere_cfg.flags & flag) != 0)
|
||||||
@@ -34,13 +34,13 @@ unsigned int exosphere_load_config(void) {
|
|||||||
generic_panic();
|
generic_panic();
|
||||||
}
|
}
|
||||||
g_has_loaded_config = true;
|
g_has_loaded_config = true;
|
||||||
|
|
||||||
const unsigned int magic = MAILBOX_EXOSPHERE_CONFIG.magic;
|
const unsigned int magic = MAILBOX_EXOSPHERE_CONFIG.magic;
|
||||||
|
|
||||||
if (magic == MAGIC_EXOSPHERE_CONFIG) {
|
if (magic == MAGIC_EXOSPHERE_CONFIG) {
|
||||||
g_exosphere_cfg = MAILBOX_EXOSPHERE_CONFIG;
|
g_exosphere_cfg = MAILBOX_EXOSPHERE_CONFIG;
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_exosphere_cfg.target_firmware;
|
return g_exosphere_cfg.target_firmware;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@ unsigned int exosphere_get_target_firmware(void) {
|
|||||||
if (!g_has_loaded_config) {
|
if (!g_has_loaded_config) {
|
||||||
generic_panic();
|
generic_panic();
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_exosphere_cfg.target_firmware;
|
return g_exosphere_cfg.target_firmware;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,15 +56,15 @@ unsigned int exosphere_should_perform_620_keygen(void) {
|
|||||||
if (!g_has_loaded_config) {
|
if (!g_has_loaded_config) {
|
||||||
generic_panic();
|
generic_panic();
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_exosphere_cfg.target_firmware >= ATMOSPHERE_TARGET_FIRMWARE_620 && EXOSPHERE_CHECK_FLAG(EXOSPHERE_FLAG_PERFORM_620_KEYGEN);
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int exosphere_should_override_debugmode_priv(void) {
|
unsigned int exosphere_should_override_debugmode_priv(void) {
|
||||||
if (!g_has_loaded_config) {
|
if (!g_has_loaded_config) {
|
||||||
generic_panic();
|
generic_panic();
|
||||||
}
|
}
|
||||||
|
|
||||||
return EXOSPHERE_CHECK_FLAG(EXOSPHERE_FLAG_IS_DEBUGMODE_PRIV);
|
return EXOSPHERE_CHECK_FLAG(EXOSPHERE_FLAG_IS_DEBUGMODE_PRIV);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ unsigned int exosphere_should_override_debugmode_user(void) {
|
|||||||
if (!g_has_loaded_config) {
|
if (!g_has_loaded_config) {
|
||||||
generic_panic();
|
generic_panic();
|
||||||
}
|
}
|
||||||
|
|
||||||
return EXOSPHERE_CHECK_FLAG(EXOSPHERE_FLAG_IS_DEBUGMODE_USER);
|
return EXOSPHERE_CHECK_FLAG(EXOSPHERE_FLAG_IS_DEBUGMODE_USER);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,10 +80,18 @@ unsigned int exosphere_should_disable_usermode_exception_handlers(void) {
|
|||||||
if (!g_has_loaded_config) {
|
if (!g_has_loaded_config) {
|
||||||
generic_panic();
|
generic_panic();
|
||||||
}
|
}
|
||||||
|
|
||||||
return EXOSPHERE_CHECK_FLAG(EXOSPHERE_FLAG_DISABLE_USERMODE_EXCEPTION_HANDLERS);
|
return EXOSPHERE_CHECK_FLAG(EXOSPHERE_FLAG_DISABLE_USERMODE_EXCEPTION_HANDLERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int exosphere_should_enable_usermode_pmu_access(void) {
|
||||||
|
if (!g_has_loaded_config) {
|
||||||
|
generic_panic();
|
||||||
|
}
|
||||||
|
|
||||||
|
return EXOSPHERE_CHECK_FLAG(EXOSPHERE_FLAG_ENABLE_USERMODE_PMU_ACCESS);
|
||||||
|
}
|
||||||
|
|
||||||
const exo_emummc_config_t *exosphere_get_emummc_config(void) {
|
const exo_emummc_config_t *exosphere_get_emummc_config(void) {
|
||||||
if (!g_has_loaded_config) {
|
if (!g_has_loaded_config) {
|
||||||
generic_panic();
|
generic_panic();
|
||||||
|
|||||||
@@ -13,12 +13,12 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EXOSPHERE_EXOSPHERE_CONFIG_H
|
#ifndef EXOSPHERE_EXOSPHERE_CONFIG_H
|
||||||
#define EXOSPHERE_EXOSPHERE_CONFIG_H
|
#define EXOSPHERE_EXOSPHERE_CONFIG_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <atmosphere.h>
|
#include <vapours/ams_version.h>
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
#include "memory_map.h"
|
#include "memory_map.h"
|
||||||
@@ -36,10 +36,11 @@
|
|||||||
/* Exosphere config in DRAM shares physical/virtual mapping. */
|
/* Exosphere config in DRAM shares physical/virtual mapping. */
|
||||||
#define MAILBOX_EXOSPHERE_CONFIG_PHYS MAILBOX_EXOSPHERE_CONFIG
|
#define MAILBOX_EXOSPHERE_CONFIG_PHYS MAILBOX_EXOSPHERE_CONFIG
|
||||||
|
|
||||||
#define EXOSPHERE_FLAG_PERFORM_620_KEYGEN (1 << 0u)
|
#define EXOSPHERE_FLAG_PERFORM_620_KEYGEN_DEPRECATED (1 << 0u)
|
||||||
#define EXOSPHERE_FLAG_IS_DEBUGMODE_PRIV (1 << 1u)
|
#define EXOSPHERE_FLAG_IS_DEBUGMODE_PRIV (1 << 1u)
|
||||||
#define EXOSPHERE_FLAG_IS_DEBUGMODE_USER (1 << 2u)
|
#define EXOSPHERE_FLAG_IS_DEBUGMODE_USER (1 << 2u)
|
||||||
#define EXOSPHERE_FLAG_DISABLE_USERMODE_EXCEPTION_HANDLERS (1 << 3u)
|
#define EXOSPHERE_FLAG_DISABLE_USERMODE_EXCEPTION_HANDLERS (1 << 3u)
|
||||||
|
#define EXOSPHERE_FLAG_ENABLE_USERMODE_PMU_ACCESS (1 << 4u)
|
||||||
#define EXOSPHERE_FLAGS_DEFAULT (EXOSPHERE_FLAG_IS_DEBUGMODE_PRIV)
|
#define EXOSPHERE_FLAGS_DEFAULT (EXOSPHERE_FLAG_IS_DEBUGMODE_PRIV)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -58,6 +59,7 @@ unsigned int exosphere_should_perform_620_keygen(void);
|
|||||||
unsigned int exosphere_should_override_debugmode_priv(void);
|
unsigned int exosphere_should_override_debugmode_priv(void);
|
||||||
unsigned int exosphere_should_override_debugmode_user(void);
|
unsigned int exosphere_should_override_debugmode_user(void);
|
||||||
unsigned int exosphere_should_disable_usermode_exception_handlers(void);
|
unsigned int exosphere_should_disable_usermode_exception_handlers(void);
|
||||||
|
unsigned int exosphere_should_enable_usermode_pmu_access(void);
|
||||||
|
|
||||||
const exo_emummc_config_t *exosphere_get_emummc_config(void);
|
const exo_emummc_config_t *exosphere_get_emummc_config(void);
|
||||||
|
|
||||||
@@ -66,7 +68,7 @@ static inline unsigned int exosphere_get_target_firmware_for_init(void) {
|
|||||||
if (magic == MAGIC_EXOSPHERE_CONFIG) {
|
if (magic == MAGIC_EXOSPHERE_CONFIG) {
|
||||||
return MAILBOX_EXOSPHERE_CONFIG_PHYS.target_firmware;
|
return MAILBOX_EXOSPHERE_CONFIG_PHYS.target_firmware;
|
||||||
} else {
|
} else {
|
||||||
return ATMOSPHERE_TARGET_FIRMWARE_DEFAULT_FOR_DEBUG;
|
return ATMOSPHERE_TARGET_FIRMWARE_CURRENT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,26 +13,57 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "i2c.h"
|
#include "i2c.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "timers.h"
|
#include "timers.h"
|
||||||
|
#include "pinmux.h"
|
||||||
|
|
||||||
/* Prototypes for internal commands. */
|
/* Prototypes for internal commands. */
|
||||||
volatile i2c_registers_t *i2c_get_registers_from_id(unsigned int id);
|
volatile tegra_i2c_t *i2c_get_registers_from_id(I2CDevice id);
|
||||||
void i2c_load_config(volatile i2c_registers_t *regs);
|
void i2c_load_config(volatile tegra_i2c_t *regs);
|
||||||
|
|
||||||
bool i2c_query(unsigned int id, uint8_t device, uint8_t r, void *dst, size_t dst_size);
|
bool i2c_query(I2CDevice id, uint8_t device, uint8_t r, void *dst, size_t dst_size);
|
||||||
bool i2c_send(unsigned int id, uint8_t device, uint8_t r, void *src, size_t src_size);
|
bool i2c_send(I2CDevice id, uint8_t device, uint8_t r, void *src, size_t src_size);
|
||||||
|
|
||||||
bool i2c_write(volatile i2c_registers_t *regs, uint8_t device, void *src, size_t src_size);
|
bool i2c_write(volatile tegra_i2c_t *regs, uint8_t device, void *src, size_t src_size);
|
||||||
bool i2c_read(volatile i2c_registers_t *regs, uint8_t device, void *dst, size_t dst_size);
|
bool i2c_read(volatile tegra_i2c_t *regs, uint8_t device, void *dst, size_t dst_size);
|
||||||
|
|
||||||
|
/* Configure I2C pinmux. */
|
||||||
|
void i2c_config(I2CDevice id) {
|
||||||
|
volatile tegra_pinmux_t *pinmux = pinmux_get_regs();
|
||||||
|
|
||||||
|
switch (id) {
|
||||||
|
case I2C_1:
|
||||||
|
pinmux->gen1_i2c_scl = PINMUX_INPUT;
|
||||||
|
pinmux->gen1_i2c_sda = PINMUX_INPUT;
|
||||||
|
break;
|
||||||
|
case I2C_2:
|
||||||
|
pinmux->gen2_i2c_scl = PINMUX_INPUT;
|
||||||
|
pinmux->gen2_i2c_sda = PINMUX_INPUT;
|
||||||
|
break;
|
||||||
|
case I2C_3:
|
||||||
|
pinmux->gen3_i2c_scl = PINMUX_INPUT;
|
||||||
|
pinmux->gen3_i2c_sda = PINMUX_INPUT;
|
||||||
|
break;
|
||||||
|
case I2C_4:
|
||||||
|
pinmux->cam_i2c_scl = PINMUX_INPUT;
|
||||||
|
pinmux->cam_i2c_sda = PINMUX_INPUT;
|
||||||
|
break;
|
||||||
|
case I2C_5:
|
||||||
|
pinmux->pwr_i2c_scl = PINMUX_INPUT;
|
||||||
|
pinmux->pwr_i2c_sda = PINMUX_INPUT;
|
||||||
|
break;
|
||||||
|
case I2C_6:
|
||||||
|
/* Unused. */
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize I2C based on registers. */
|
/* Initialize I2C based on registers. */
|
||||||
void i2c_init(unsigned int id) {
|
void i2c_init(I2CDevice id) {
|
||||||
volatile i2c_registers_t *regs = i2c_get_registers_from_id(id);
|
volatile tegra_i2c_t *regs = i2c_get_registers_from_id(id);
|
||||||
|
|
||||||
/* Setup divisor, and clear the bus. */
|
/* Setup divisor, and clear the bus. */
|
||||||
regs->I2C_I2C_CLK_DIVISOR_REGISTER_0 = 0x50001;
|
regs->I2C_I2C_CLK_DIVISOR_REGISTER_0 = 0x50001;
|
||||||
@@ -43,7 +74,7 @@ void i2c_init(unsigned int id) {
|
|||||||
|
|
||||||
/* Wait a while until BUS_CLEAR_DONE is set. */
|
/* Wait a while until BUS_CLEAR_DONE is set. */
|
||||||
for (unsigned int i = 0; i < 10; i++) {
|
for (unsigned int i = 0; i < 10; i++) {
|
||||||
wait(20000);
|
wait(25);
|
||||||
if (regs->I2C_INTERRUPT_STATUS_REGISTER_0 & 0x800) {
|
if (regs->I2C_INTERRUPT_STATUS_REGISTER_0 & 0x800) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -57,20 +88,20 @@ void i2c_init(unsigned int id) {
|
|||||||
regs->I2C_INTERRUPT_STATUS_REGISTER_0 = int_status;
|
regs->I2C_INTERRUPT_STATUS_REGISTER_0 = int_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sets a bit in a PMIC register over I2C during CPU shutdown. */
|
/* Sets a bit in a PMIC register over I2C during CPU shutdown. */
|
||||||
void i2c_send_pmic_cpu_shutdown_cmd(void) {
|
void i2c_send_pmic_cpu_shutdown_cmd(void) {
|
||||||
uint32_t val = 0;
|
uint32_t val = 0;
|
||||||
/* PMIC == Device 4:3C. */
|
/* PMIC == Device 4:3C. */
|
||||||
i2c_query(4, 0x3C, 0x41, &val, 1);
|
i2c_query(I2C_5, MAX77620_PWR_I2C_ADDR, 0x41, &val, 1);
|
||||||
val |= 4;
|
val |= 4;
|
||||||
i2c_send(4, 0x3C, 0x41, &val, 1);
|
i2c_send(I2C_5, MAX77620_PWR_I2C_ADDR, 0x41, &val, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Queries the value of TI charger bit over I2C. */
|
/* Queries the value of TI charger bit over I2C. */
|
||||||
bool i2c_query_ti_charger_bit_7(void) {
|
bool i2c_query_ti_charger_bit_7(void) {
|
||||||
uint32_t val = 0;
|
uint32_t val = 0;
|
||||||
/* TI Charger = Device 0:6B. */
|
/* TI Charger = Device 0:6B. */
|
||||||
i2c_query(0, 0x6B, 0, &val, 1);
|
i2c_query(I2C_1, BQ24193_I2C_ADDR, 0, &val, 1);
|
||||||
return (val & 0x80) != 0;
|
return (val & 0x80) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,34 +109,34 @@ bool i2c_query_ti_charger_bit_7(void) {
|
|||||||
void i2c_clear_ti_charger_bit_7(void) {
|
void i2c_clear_ti_charger_bit_7(void) {
|
||||||
uint32_t val = 0;
|
uint32_t val = 0;
|
||||||
/* TI Charger = Device 0:6B. */
|
/* TI Charger = Device 0:6B. */
|
||||||
i2c_query(0, 0x6B, 0, &val, 1);
|
i2c_query(I2C_1, BQ24193_I2C_ADDR, 0, &val, 1);
|
||||||
val &= 0x7F;
|
val &= 0x7F;
|
||||||
i2c_send(0, 0x6B, 0, &val, 1);
|
i2c_send(I2C_1, BQ24193_I2C_ADDR, 0, &val, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sets TI charger bit over I2C. */
|
/* Sets TI charger bit over I2C. */
|
||||||
void i2c_set_ti_charger_bit_7(void) {
|
void i2c_set_ti_charger_bit_7(void) {
|
||||||
uint32_t val = 0;
|
uint32_t val = 0;
|
||||||
/* TI Charger = Device 0:6B. */
|
/* TI Charger = Device 0:6B. */
|
||||||
i2c_query(0, 0x6B, 0, &val, 1);
|
i2c_query(I2C_1, BQ24193_I2C_ADDR, 0, &val, 1);
|
||||||
val |= 0x80;
|
val |= 0x80;
|
||||||
i2c_send(0, 0x6B, 0, &val, 1);
|
i2c_send(I2C_1, BQ24193_I2C_ADDR, 0, &val, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get registers pointer based on I2C ID. */
|
/* Get registers pointer based on I2C ID. */
|
||||||
volatile i2c_registers_t *i2c_get_registers_from_id(unsigned int id) {
|
volatile tegra_i2c_t *i2c_get_registers_from_id(I2CDevice id) {
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case 0:
|
case I2C_1:
|
||||||
return I2C1_REGS;
|
return I2C1_REGS;
|
||||||
case 1:
|
case I2C_2:
|
||||||
return I2C2_REGS;
|
return I2C2_REGS;
|
||||||
case 2:
|
case I2C_3:
|
||||||
return I2C3_REGS;
|
return I2C3_REGS;
|
||||||
case 3:
|
case I2C_4:
|
||||||
return I2C4_REGS;
|
return I2C4_REGS;
|
||||||
case 4:
|
case I2C_5:
|
||||||
return I2C5_REGS;
|
return I2C5_REGS;
|
||||||
case 5:
|
case I2C_6:
|
||||||
return I2C6_REGS;
|
return I2C6_REGS;
|
||||||
default:
|
default:
|
||||||
generic_panic();
|
generic_panic();
|
||||||
@@ -114,7 +145,7 @@ volatile i2c_registers_t *i2c_get_registers_from_id(unsigned int id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Load hardware config for I2C4. */
|
/* Load hardware config for I2C4. */
|
||||||
void i2c_load_config(volatile i2c_registers_t *regs) {
|
void i2c_load_config(volatile tegra_i2c_t *regs) {
|
||||||
/* Set MSTR_CONFIG_LOAD, TIMEOUT_CONFIG_LOAD, undocumented bit. */
|
/* Set MSTR_CONFIG_LOAD, TIMEOUT_CONFIG_LOAD, undocumented bit. */
|
||||||
regs->I2C_I2C_CONFIG_LOAD_0 = 0x25;
|
regs->I2C_I2C_CONFIG_LOAD_0 = 0x25;
|
||||||
|
|
||||||
@@ -128,10 +159,10 @@ void i2c_load_config(volatile i2c_registers_t *regs) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Reads a register from a device over I2C, writes result to output. */
|
/* Reads a register from a device over I2C, writes result to output. */
|
||||||
bool i2c_query(unsigned int id, uint8_t device, uint8_t r, void *dst, size_t dst_size) {
|
bool i2c_query(I2CDevice id, uint8_t device, uint8_t r, void *dst, size_t dst_size) {
|
||||||
volatile i2c_registers_t *regs = i2c_get_registers_from_id(id);
|
volatile tegra_i2c_t *regs = i2c_get_registers_from_id(id);
|
||||||
uint32_t val = r;
|
uint32_t val = r;
|
||||||
|
|
||||||
/* Write single byte register ID to device. */
|
/* Write single byte register ID to device. */
|
||||||
if (!i2c_write(regs, device, &val, 1)) {
|
if (!i2c_write(regs, device, &val, 1)) {
|
||||||
return false;
|
return false;
|
||||||
@@ -140,12 +171,12 @@ bool i2c_query(unsigned int id, uint8_t device, uint8_t r, void *dst, size_t dst
|
|||||||
if (dst_size > 4) {
|
if (dst_size > 4) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return i2c_read(regs, device, dst, dst_size);
|
return i2c_read(regs, device, dst, dst_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Writes a value to a register over I2C. */
|
/* Writes a value to a register over I2C. */
|
||||||
bool i2c_send(unsigned int id, uint8_t device, uint8_t r, void *src, size_t src_size) {
|
bool i2c_send(I2CDevice id, uint8_t device, uint8_t r, void *src, size_t src_size) {
|
||||||
uint32_t val = r;
|
uint32_t val = r;
|
||||||
if (src_size == 0) {
|
if (src_size == 0) {
|
||||||
return true;
|
return true;
|
||||||
@@ -158,7 +189,7 @@ bool i2c_send(unsigned int id, uint8_t device, uint8_t r, void *src, size_t src_
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Writes bytes to device over I2C. */
|
/* Writes bytes to device over I2C. */
|
||||||
bool i2c_write(volatile i2c_registers_t *regs, uint8_t device, void *src, size_t src_size) {
|
bool i2c_write(volatile tegra_i2c_t *regs, uint8_t device, void *src, size_t src_size) {
|
||||||
if (src_size > 4) {
|
if (src_size > 4) {
|
||||||
return false;
|
return false;
|
||||||
} else if (src_size == 0) {
|
} else if (src_size == 0) {
|
||||||
@@ -177,8 +208,7 @@ bool i2c_write(volatile i2c_registers_t *regs, uint8_t device, void *src, size_t
|
|||||||
i2c_load_config(regs);
|
i2c_load_config(regs);
|
||||||
|
|
||||||
/* Config |= SEND; */
|
/* Config |= SEND; */
|
||||||
regs->I2C_I2C_CNFG_0 |= 0x200;
|
regs->I2C_I2C_CNFG_0 = ((regs->I2C_I2C_CNFG_0 & 0xFFFFFDFF) | 0x200);
|
||||||
|
|
||||||
|
|
||||||
while (regs->I2C_I2C_STATUS_0 & 0x100) {
|
while (regs->I2C_I2C_STATUS_0 & 0x100) {
|
||||||
/* Wait until not busy. */
|
/* Wait until not busy. */
|
||||||
@@ -189,7 +219,7 @@ bool i2c_write(volatile i2c_registers_t *regs, uint8_t device, void *src, size_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Reads bytes from device over I2C. */
|
/* Reads bytes from device over I2C. */
|
||||||
bool i2c_read(volatile i2c_registers_t *regs, uint8_t device, void *dst, size_t dst_size) {
|
bool i2c_read(volatile tegra_i2c_t *regs, uint8_t device, void *dst, size_t dst_size) {
|
||||||
if (dst_size > 4) {
|
if (dst_size > 4) {
|
||||||
return false;
|
return false;
|
||||||
} else if (dst_size == 0) {
|
} else if (dst_size == 0) {
|
||||||
@@ -205,13 +235,12 @@ bool i2c_read(volatile i2c_registers_t *regs, uint8_t device, void *dst, size_t
|
|||||||
i2c_load_config(regs);
|
i2c_load_config(regs);
|
||||||
|
|
||||||
/* Config |= SEND; */
|
/* Config |= SEND; */
|
||||||
regs->I2C_I2C_CNFG_0 |= 0x200;
|
regs->I2C_I2C_CNFG_0 = ((regs->I2C_I2C_CNFG_0 & 0xFFFFFDFF) | 0x200);
|
||||||
|
|
||||||
|
|
||||||
while (regs->I2C_I2C_STATUS_0 & 0x100) {
|
while (regs->I2C_I2C_STATUS_0 & 0x100) {
|
||||||
/* Wait until not busy. */
|
/* Wait until not busy. */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ensure success. */
|
/* Ensure success. */
|
||||||
if ((regs->I2C_I2C_STATUS_0 & 0xF) != 0) {
|
if ((regs->I2C_I2C_STATUS_0 & 0xF) != 0) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -19,10 +19,27 @@
|
|||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
#include "memory_map.h"
|
#include "memory_map.h"
|
||||||
|
|
||||||
/* Exosphere driver for the Tegra X1 I2C registers. */
|
/* Exosphere driver for the Tegra X1 I2C registers. */
|
||||||
|
|
||||||
|
#define MAX77621_CPU_I2C_ADDR 0x1B
|
||||||
|
#define MAX77621_GPU_I2C_ADDR 0x1C
|
||||||
|
#define MAX17050_I2C_ADDR 0x36
|
||||||
|
#define MAX77620_PWR_I2C_ADDR 0x3C
|
||||||
|
#define MAX77620_RTC_I2C_ADDR 0x68
|
||||||
|
#define BQ24193_I2C_ADDR 0x6B
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
I2C_1 = 0,
|
||||||
|
I2C_2 = 1,
|
||||||
|
I2C_3 = 2,
|
||||||
|
I2C_4 = 3,
|
||||||
|
I2C_5 = 4,
|
||||||
|
I2C_6 = 5,
|
||||||
|
} I2CDevice;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t I2C_I2C_CNFG_0;
|
uint32_t I2C_I2C_CNFG_0;
|
||||||
uint32_t I2C_I2C_CMD_ADDR0_0;
|
uint32_t I2C_I2C_CMD_ADDR0_0;
|
||||||
@@ -65,7 +82,7 @@ typedef struct {
|
|||||||
uint32_t I2C_I2C_INTERFACE_TIMING_1_0;
|
uint32_t I2C_I2C_INTERFACE_TIMING_1_0;
|
||||||
uint32_t I2C_I2C_HS_INTERFACE_TIMING_0_0;
|
uint32_t I2C_I2C_HS_INTERFACE_TIMING_0_0;
|
||||||
uint32_t I2C_I2C_HS_INTERFACE_TIMING_1_0;
|
uint32_t I2C_I2C_HS_INTERFACE_TIMING_1_0;
|
||||||
} i2c_registers_t;
|
} tegra_i2c_t;
|
||||||
|
|
||||||
static inline uintptr_t get_i2c_dtv_234_base(void) {
|
static inline uintptr_t get_i2c_dtv_234_base(void) {
|
||||||
return MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_DTV_I2C234);
|
return MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_DTV_I2C234);
|
||||||
@@ -75,17 +92,20 @@ static inline uintptr_t get_i2c56_spi2b_base(void) {
|
|||||||
return MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_I2C56_SPI2B);
|
return MMIO_GET_DEVICE_ADDRESS(MMIO_DEVID_I2C56_SPI2B);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define I2C1_REGS ((volatile i2c_registers_t *)(get_i2c_dtv_234_base() + 0x000))
|
#define I2C1_REGS ((volatile tegra_i2c_t *)(get_i2c_dtv_234_base() + 0x000))
|
||||||
#define I2C2_REGS ((volatile i2c_registers_t *)(get_i2c_dtv_234_base() + 0x400))
|
#define I2C2_REGS ((volatile tegra_i2c_t *)(get_i2c_dtv_234_base() + 0x400))
|
||||||
#define I2C3_REGS ((volatile i2c_registers_t *)(get_i2c_dtv_234_base() + 0x500))
|
#define I2C3_REGS ((volatile tegra_i2c_t *)(get_i2c_dtv_234_base() + 0x500))
|
||||||
#define I2C4_REGS ((volatile i2c_registers_t *)(get_i2c_dtv_234_base() + 0x700))
|
#define I2C4_REGS ((volatile tegra_i2c_t *)(get_i2c_dtv_234_base() + 0x700))
|
||||||
#define I2C5_REGS ((volatile i2c_registers_t *)(get_i2c56_spi2b_base() + 0x000))
|
#define I2C5_REGS ((volatile tegra_i2c_t *)(get_i2c56_spi2b_base() + 0x000))
|
||||||
#define I2C6_REGS ((volatile i2c_registers_t *)(get_i2c56_spi2b_base() + 0x100))
|
#define I2C6_REGS ((volatile tegra_i2c_t *)(get_i2c56_spi2b_base() + 0x100))
|
||||||
|
|
||||||
void i2c_init(unsigned int id);
|
void i2c_config(I2CDevice id);
|
||||||
|
|
||||||
|
void i2c_init(I2CDevice id);
|
||||||
|
bool i2c_query(I2CDevice id, uint8_t device, uint8_t r, void *dst, size_t dst_size);
|
||||||
|
bool i2c_send(I2CDevice id, uint8_t device, uint8_t r, void *src, size_t src_size);
|
||||||
|
|
||||||
void i2c_send_pmic_cpu_shutdown_cmd(void);
|
void i2c_send_pmic_cpu_shutdown_cmd(void);
|
||||||
|
|
||||||
bool i2c_query_ti_charger_bit_7(void);
|
bool i2c_query_ti_charger_bit_7(void);
|
||||||
void i2c_clear_ti_charger_bit_7(void);
|
void i2c_clear_ti_charger_bit_7(void);
|
||||||
void i2c_set_ti_charger_bit_7(void);
|
void i2c_set_ti_charger_bit_7(void);
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -42,6 +42,9 @@ static const uint8_t mkey_vectors_dev[MASTERKEY_REVISION_MAX][0x10] =
|
|||||||
{0x78, 0xD5, 0xF1, 0x20, 0x3D, 0x16, 0xE9, 0x30, 0x32, 0x27, 0x34, 0x6F, 0xCF, 0xE0, 0x27, 0xDC}, /* Master key 04 encrypted with Master key 05. */
|
{0x78, 0xD5, 0xF1, 0x20, 0x3D, 0x16, 0xE9, 0x30, 0x32, 0x27, 0x34, 0x6F, 0xCF, 0xE0, 0x27, 0xDC}, /* Master key 04 encrypted with Master key 05. */
|
||||||
{0x6F, 0xD2, 0x84, 0x1D, 0x05, 0xEC, 0x40, 0x94, 0x5F, 0x18, 0xB3, 0x81, 0x09, 0x98, 0x8D, 0x4E}, /* Master key 05 encrypted with Master key 06. */
|
{0x6F, 0xD2, 0x84, 0x1D, 0x05, 0xEC, 0x40, 0x94, 0x5F, 0x18, 0xB3, 0x81, 0x09, 0x98, 0x8D, 0x4E}, /* Master key 05 encrypted with Master key 06. */
|
||||||
{0x37, 0xAF, 0xAB, 0x35, 0x79, 0x09, 0xD9, 0x48, 0x29, 0xD2, 0xDB, 0xA5, 0xA5, 0xF5, 0x30, 0x19}, /* Master key 06 encrypted with Master key 07. */
|
{0x37, 0xAF, 0xAB, 0x35, 0x79, 0x09, 0xD9, 0x48, 0x29, 0xD2, 0xDB, 0xA5, 0xA5, 0xF5, 0x30, 0x19}, /* Master key 06 encrypted with Master key 07. */
|
||||||
|
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* TODO: Master key 07 encrypted with Master key 08. */
|
||||||
|
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* TODO: Master key 08 encrypted with Master key 09. */
|
||||||
|
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* TODO: Master key 09 encrypted with Master key 0A. */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Retail unit keys. */
|
/* Retail unit keys. */
|
||||||
@@ -55,6 +58,9 @@ static const uint8_t mkey_vectors[MASTERKEY_REVISION_MAX][0x10] =
|
|||||||
{0xEB, 0xF5, 0x6F, 0x83, 0x61, 0x9E, 0xF8, 0xFA, 0xE0, 0x87, 0xD7, 0xA1, 0x4E, 0x25, 0x36, 0xEE}, /* Master key 04 encrypted with Master key 05. */
|
{0xEB, 0xF5, 0x6F, 0x83, 0x61, 0x9E, 0xF8, 0xFA, 0xE0, 0x87, 0xD7, 0xA1, 0x4E, 0x25, 0x36, 0xEE}, /* Master key 04 encrypted with Master key 05. */
|
||||||
{0x1E, 0x1E, 0x22, 0xC0, 0x5A, 0x33, 0x3C, 0xB9, 0x0B, 0xA9, 0x03, 0x04, 0xBA, 0xDB, 0x07, 0x57}, /* Master key 05 encrypted with Master key 06. */
|
{0x1E, 0x1E, 0x22, 0xC0, 0x5A, 0x33, 0x3C, 0xB9, 0x0B, 0xA9, 0x03, 0x04, 0xBA, 0xDB, 0x07, 0x57}, /* Master key 05 encrypted with Master key 06. */
|
||||||
{0xA4, 0xD4, 0x52, 0x6F, 0xD1, 0xE4, 0x36, 0xAA, 0x9F, 0xCB, 0x61, 0x27, 0x1C, 0x67, 0x65, 0x1F}, /* Master key 06 encrypted with Master key 07. */
|
{0xA4, 0xD4, 0x52, 0x6F, 0xD1, 0xE4, 0x36, 0xAA, 0x9F, 0xCB, 0x61, 0x27, 0x1C, 0x67, 0x65, 0x1F}, /* Master key 06 encrypted with Master key 07. */
|
||||||
|
{0xEA, 0x60, 0xB3, 0xEA, 0xCE, 0x8F, 0x24, 0x46, 0x7D, 0x33, 0x9C, 0xD1, 0xBC, 0x24, 0x98, 0x29}, /* Master key 07 encrypted with Master key 08. */
|
||||||
|
{0x4D, 0xD9, 0x98, 0x42, 0x45, 0x0D, 0xB1, 0x3C, 0x52, 0x0C, 0x9A, 0x44, 0xBB, 0xAD, 0xAF, 0x80}, /* Master key 08 encrypted with Master key 09. */
|
||||||
|
{0xB8, 0x96, 0x9E, 0x4A, 0x00, 0x0D, 0xD6, 0x28, 0xB3, 0xD1, 0xDB, 0x68, 0x5F, 0xFB, 0xE1, 0x2A}, /* Master key 09 encrypted with Master key 0A. */
|
||||||
};
|
};
|
||||||
|
|
||||||
bool check_mkey_revision(unsigned int revision, bool is_retail) {
|
bool check_mkey_revision(unsigned int revision, bool is_retail) {
|
||||||
@@ -83,7 +89,7 @@ void mkey_detect_revision(void) {
|
|||||||
if (g_determined_mkey_revision) {
|
if (g_determined_mkey_revision) {
|
||||||
generic_panic();
|
generic_panic();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned int rev = 0; rev < MASTERKEY_REVISION_MAX; rev++) {
|
for (unsigned int rev = 0; rev < MASTERKEY_REVISION_MAX; rev++) {
|
||||||
if (check_mkey_revision(rev, configitem_is_retail())) {
|
if (check_mkey_revision(rev, configitem_is_retail())) {
|
||||||
g_determined_mkey_revision = true;
|
g_determined_mkey_revision = true;
|
||||||
@@ -91,7 +97,7 @@ void mkey_detect_revision(void) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We must have determined the master key, or we're not running on a Switch. */
|
/* We must have determined the master key, or we're not running on a Switch. */
|
||||||
if (!g_determined_mkey_revision) {
|
if (!g_determined_mkey_revision) {
|
||||||
/* Panic in bright red. */
|
/* Panic in bright red. */
|
||||||
@@ -125,7 +131,6 @@ unsigned int mkey_get_keyslot(unsigned int revision) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void set_old_devkey(unsigned int revision, const uint8_t *key) {
|
void set_old_devkey(unsigned int revision, const uint8_t *key) {
|
||||||
if (revision < MASTERKEY_REVISION_400_410 || MASTERKEY_REVISION_MAX <= revision) {
|
if (revision < MASTERKEY_REVISION_400_410 || MASTERKEY_REVISION_MAX <= revision) {
|
||||||
generic_panic();
|
generic_panic();
|
||||||
@@ -135,23 +140,17 @@ void set_old_devkey(unsigned int revision, const uint8_t *key) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned int devkey_get_keyslot(unsigned int revision) {
|
unsigned int devkey_get_keyslot(unsigned int revision) {
|
||||||
if (!g_determined_mkey_revision || revision >= MASTERKEY_REVISION_MAX) {
|
if (!g_determined_mkey_revision || revision > g_mkey_revision) {
|
||||||
generic_panic();
|
generic_panic();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (revision > g_mkey_revision) {
|
if (revision < MASTERKEY_REVISION_400_410) {
|
||||||
generic_panic();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (revision >= 1) {
|
|
||||||
if (revision == MASTERKEY_REVISION_MAX) {
|
|
||||||
return KEYSLOT_SWITCH_DEVICEKEY;
|
|
||||||
} else {
|
|
||||||
/* Load into a temp keyslot. */
|
|
||||||
set_aes_keyslot(KEYSLOT_SWITCH_TEMPKEY, g_old_devicekeys[revision - MASTERKEY_REVISION_400_410], 0x10);
|
|
||||||
return KEYSLOT_SWITCH_TEMPKEY;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return KEYSLOT_SWITCH_4XOLDDEVICEKEY;
|
return KEYSLOT_SWITCH_4XOLDDEVICEKEY;
|
||||||
|
} else if (revision < g_mkey_revision) {
|
||||||
|
/* Load into a temp keyslot. */
|
||||||
|
set_aes_keyslot(KEYSLOT_SWITCH_TEMPKEY, g_old_devicekeys[revision - MASTERKEY_REVISION_400_410], 0x10);
|
||||||
|
return KEYSLOT_SWITCH_TEMPKEY;
|
||||||
|
} else {
|
||||||
|
return KEYSLOT_SWITCH_DEVICEKEY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,14 +13,14 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EXOSPHERE_MASTERKEY_H
|
#ifndef EXOSPHERE_MASTERKEY_H
|
||||||
#define EXOSPHERE_MASTERKEY_H
|
#define EXOSPHERE_MASTERKEY_H
|
||||||
|
|
||||||
/* This is glue code to enable master key support across versions. */
|
/* This is glue code to enable master key support across versions. */
|
||||||
|
|
||||||
/* TODO: Update to 0x9 on release of new master key. */
|
/* TODO: Update to 0xC on release of new master key. */
|
||||||
#define MASTERKEY_REVISION_MAX 0x8
|
#define MASTERKEY_REVISION_MAX 0xB
|
||||||
|
|
||||||
#define MASTERKEY_REVISION_100_230 0x00
|
#define MASTERKEY_REVISION_100_230 0x00
|
||||||
#define MASTERKEY_REVISION_300 0x01
|
#define MASTERKEY_REVISION_300 0x01
|
||||||
@@ -29,7 +29,10 @@
|
|||||||
#define MASTERKEY_REVISION_500_510 0x04
|
#define MASTERKEY_REVISION_500_510 0x04
|
||||||
#define MASTERKEY_REVISION_600_610 0x05
|
#define MASTERKEY_REVISION_600_610 0x05
|
||||||
#define MASTERKEY_REVISION_620 0x06
|
#define MASTERKEY_REVISION_620 0x06
|
||||||
#define MASTERKEY_REVISION_700_CURRENT 0x07
|
#define MASTERKEY_REVISION_700_800 0x07
|
||||||
|
#define MASTERKEY_REVISION_810 0x08
|
||||||
|
#define MASTERKEY_REVISION_900 0x09
|
||||||
|
#define MASTERKEY_REVISION_910_CURRENT 0x0A
|
||||||
|
|
||||||
#define MASTERKEY_NUM_NEW_DEVICE_KEYS (MASTERKEY_REVISION_MAX - MASTERKEY_REVISION_400_410)
|
#define MASTERKEY_NUM_NEW_DEVICE_KEYS (MASTERKEY_REVISION_MAX - MASTERKEY_REVISION_400_410)
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user