Compare commits
198 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
89cc6ede1a | ||
|
|
dd6e071dde | ||
|
|
2127271b33 | ||
|
|
1600171ffa | ||
|
|
7f7a9fab2d | ||
|
|
b15d86f31d | ||
|
|
89a3dc8643 | ||
|
|
3477beb05c | ||
|
|
8447c209a7 | ||
|
|
e78f706c1a | ||
|
|
f776c56cd4 | ||
|
|
dc195dffad | ||
|
|
a2177c0510 | ||
|
|
356a94cc2e | ||
|
|
9d507e046c | ||
|
|
47c47f967a | ||
|
|
1182d3a627 | ||
|
|
938cb6492f | ||
|
|
fed62855cb | ||
|
|
4f54596658 | ||
|
|
0b41ed04d5 | ||
|
|
9509a86998 | ||
|
|
6d4d80a798 | ||
|
|
76d274cfe2 | ||
|
|
ccf13be964 | ||
|
|
e36b27ccf0 | ||
|
|
34c80ad476 | ||
|
|
97ae106d8e | ||
|
|
7cb74b74d7 | ||
|
|
337205eb08 | ||
|
|
f36977017b | ||
|
|
e40b547bb6 | ||
|
|
1fd689f5da | ||
|
|
c5c8dca14c | ||
|
|
11f820efa7 | ||
|
|
9074688491 | ||
|
|
1de27c54f1 | ||
|
|
3e67e64faa | ||
|
|
553f8d2533 | ||
|
|
ec7ae35da1 | ||
|
|
7e8da0d236 | ||
|
|
b3e6561072 | ||
|
|
41f32ed983 | ||
|
|
bbadf840ef | ||
|
|
acc50aae46 | ||
|
|
6a68a77973 | ||
|
|
0f4d66dd61 | ||
|
|
d28642d2c3 | ||
|
|
ca4685cc42 | ||
|
|
522f10582d | ||
|
|
239d113177 | ||
|
|
fd80294bf2 | ||
|
|
b379d83469 | ||
|
|
27f352fdf1 | ||
|
|
bfec874a7c | ||
|
|
93561003e8 | ||
|
|
1572bfd989 | ||
|
|
cb945612a3 | ||
|
|
1b440f7f3b | ||
|
|
78791f7b66 | ||
|
|
5def0c18e2 | ||
|
|
0e67b0f026 | ||
|
|
8052946517 | ||
|
|
b6d6cc9750 | ||
|
|
2a840f2c79 | ||
|
|
4eaf791849 | ||
|
|
be0f50b19c | ||
|
|
f30b7b9fb3 | ||
|
|
6a0f332e3c | ||
|
|
16530d3a52 | ||
|
|
20af9c6750 | ||
|
|
fee9f6b427 | ||
|
|
57d03d6333 | ||
|
|
0075fe2aa0 | ||
|
|
d54417ac0a | ||
|
|
648801d432 | ||
|
|
2be2826b0b | ||
|
|
37a9fa1bf4 | ||
|
|
65af93c8ce | ||
|
|
8353b84944 | ||
|
|
d6a89db495 | ||
|
|
f156aa8cdb | ||
|
|
f9adbcc9d9 | ||
|
|
cf8696ac70 | ||
|
|
9c5766f649 | ||
|
|
c9701f93b9 | ||
|
|
56e54cd110 | ||
|
|
55836b48af | ||
|
|
09bfdb9ee1 | ||
|
|
1c2e8dec11 | ||
|
|
506b16db37 | ||
|
|
8f03234e58 | ||
|
|
44b5e10323 | ||
|
|
48303604b0 | ||
|
|
ab2ddbc2ee | ||
|
|
9495bf30bf | ||
|
|
a4899a1bec | ||
|
|
882c6cf0d4 | ||
|
|
a5e18c82d1 | ||
|
|
22a8661fe1 | ||
|
|
8258a98647 | ||
|
|
76dde0e6db | ||
|
|
1a39cb27e4 | ||
|
|
95d2d0a6bd | ||
|
|
98d4345858 | ||
|
|
1e4431dcc9 | ||
|
|
348b175994 | ||
|
|
76f057dafb | ||
|
|
188400c5a9 | ||
|
|
a74d9c6d3e | ||
|
|
f8bcfb2f58 | ||
|
|
d63fc2bc82 | ||
|
|
8e31784996 | ||
|
|
f27cdb4543 | ||
|
|
a39adc8ac1 | ||
|
|
97bef66018 | ||
|
|
bb5518b0f6 | ||
|
|
ac73a96ce2 | ||
|
|
7075004e58 | ||
|
|
ddf8ba5116 | ||
|
|
f46773ba64 | ||
|
|
f67d333457 | ||
|
|
4116c1e00f | ||
|
|
bc1aa15dd7 | ||
|
|
ecd27f7eaa | ||
|
|
618ce671ac | ||
|
|
2a6a655804 | ||
|
|
33436ae2a6 | ||
|
|
9f2b66ac51 | ||
|
|
df93e4797e | ||
|
|
538d1dec77 | ||
|
|
2492c8273a | ||
|
|
d358df48a6 | ||
|
|
f619dafff1 | ||
|
|
0419fc4e30 | ||
|
|
13317b9548 | ||
|
|
18db70a669 | ||
|
|
f79923814d | ||
|
|
c92de03a5f | ||
|
|
3f356da879 | ||
|
|
9efac01c86 | ||
|
|
ca2622af7c | ||
|
|
aa8e0bda8c | ||
|
|
c79f11ee99 | ||
|
|
04d0770b90 | ||
|
|
fbf8a1b6d9 | ||
|
|
a3cb6a622d | ||
|
|
0790a3ceb3 | ||
|
|
4fa12f90fc | ||
|
|
d5d56e7634 | ||
|
|
a964089df4 | ||
|
|
5fd5b4da89 | ||
|
|
322a7050aa | ||
|
|
b7f4ac02c8 | ||
|
|
009f61a8b6 | ||
|
|
26d0cafb39 | ||
|
|
bd1d4a77fe | ||
|
|
f235bc83a8 | ||
|
|
9c6b540905 | ||
|
|
d2e911a58e | ||
|
|
9344a7b434 | ||
|
|
cd194fa5b2 | ||
|
|
49c0ab65df | ||
|
|
8f9c1305e4 | ||
|
|
d4193ec11d | ||
|
|
6b9b0472bc | ||
|
|
7e74258363 | ||
|
|
f6483ec602 | ||
|
|
36c1da1d61 | ||
|
|
6bcb1f8679 | ||
|
|
62932a9639 | ||
|
|
a4629e4b65 | ||
|
|
a0c2b43b34 | ||
|
|
3907c46980 | ||
|
|
7e7ab124a3 | ||
|
|
cfc6cf24bf | ||
|
|
46e9cb6b23 | ||
|
|
ba14efe1f4 | ||
|
|
3d8f62d38f | ||
|
|
3edaf0af64 | ||
|
|
9273a88db7 | ||
|
|
37ba2c15de | ||
|
|
557f2057f7 | ||
|
|
6b5cc93780 | ||
|
|
9760191af8 | ||
|
|
8845e4dd20 | ||
|
|
8cf823f548 | ||
|
|
2538769f3a | ||
|
|
89fca38807 | ||
|
|
dcc0eed69c | ||
|
|
817475257e | ||
|
|
f2861058ba | ||
|
|
5d2a7315d5 | ||
|
|
1520ab7555 | ||
|
|
d4d0fbd73b | ||
|
|
ddb8e98e95 | ||
|
|
fd69b4169f | ||
|
|
b48e0b5c5b |
20
.github/ISSUE_TEMPLATE.md
vendored
20
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,11 +1,13 @@
|
|||||||
<!--
|
<!--
|
||||||
-- THIS IS NOT A SUPPORT FORUM! For support go here:
|
-- THIS IS NOT A SUPPORT FORUM! For support go here:
|
||||||
-- Nintendo Hacking: https://discord.gg/MjzatM8y
|
-- Nintendo Homebrew: https://discord.gg/MjzatM8
|
||||||
|
--
|
||||||
|
-- Rosalina feature requests go here: https://github.com/AuroraWright/Luma3DS/issues/752
|
||||||
--
|
--
|
||||||
-- Also check the Wiki (https://github.com/AuroraWright/Luma3DS/wiki) before making an issue.
|
-- Also check the Wiki (https://github.com/AuroraWright/Luma3DS/wiki) before making an issue.
|
||||||
--
|
--
|
||||||
-- For GBA/DSiWare/DS/AGB_FIRM/TWL_FIRM problems: https://3ds.guide/troubleshooting
|
-- For GBA/DSiWare/DS/AGB_FIRM/TWL_FIRM problems: https://3ds.hacks.guide/troubleshooting
|
||||||
-- If you're using an emu/redNAND anything related to that must also be installed to sysNAND.
|
-- If you're using an emu/redNAND try installing anything on it to sysNAND.
|
||||||
-- Please make sure to read "Enable game patching" https://github.com/AuroraWright/Luma3DS/wiki/Options-and-usage before posting any issues about the "Enable game patching" option(s).
|
-- Please make sure to read "Enable game patching" https://github.com/AuroraWright/Luma3DS/wiki/Options-and-usage before posting any issues about the "Enable game patching" option(s).
|
||||||
--
|
--
|
||||||
-- Luma updaters that don't support Boot9Strap/Sighax won't work.
|
-- Luma updaters that don't support Boot9Strap/Sighax won't work.
|
||||||
@@ -18,7 +20,7 @@
|
|||||||
|
|
||||||
**SysNAND version (+emu/redNAND version if applicable):**
|
**SysNAND version (+emu/redNAND version if applicable):**
|
||||||
|
|
||||||
[e.g. 11.4.0-37U SysNAND, 11.4.0-37J EmuNAND]
|
[e.g. 11.6.0-39U SysNAND, 11.6.0-39J EmuNAND]
|
||||||
|
|
||||||
**Entrypoint (How/what you're using to boot Luma3DS):**
|
**Entrypoint (How/what you're using to boot Luma3DS):**
|
||||||
|
|
||||||
@@ -26,7 +28,7 @@
|
|||||||
|
|
||||||
**Luma3DS version:**
|
**Luma3DS version:**
|
||||||
|
|
||||||
[e.g. 7.1 stable or if using nightly/hourly specify the commit like this https://github.com/AuroraWright/Luma3DS/commit/9570e6cbeca53128433abbf5e3473cb8a07fe69e]
|
[e.g. 8.1.1 stable or if using nightly/hourly specify the commit like this https://github.com/AuroraWright/Luma3DS/commit/9570e6cbeca53128433abbf5e3473cb8a07fe69e]
|
||||||
<!--You can check which version you're on in System Settings. It will be on the bottom right of the top screen.-->
|
<!--You can check which version you're on in System Settings. It will be on the bottom right of the top screen.-->
|
||||||
|
|
||||||
|
|
||||||
@@ -51,9 +53,7 @@ Use EmuNAND FIRM if booting with R: ( )
|
|||||||
|
|
||||||
Enable loading external FIRMs and modules: ( )
|
Enable loading external FIRMs and modules: ( )
|
||||||
<!--Firmware (.bin) files are not required by Luma, or NTR CFW anymore.
|
<!--Firmware (.bin) files are not required by Luma, or NTR CFW anymore.
|
||||||
-- If you're having issues with this option enabled try deleting them from the luma folder on the root of the SD card and disabling this option.-->
|
-- If you're having issues with this option enabled try deleting them from the luma folder on the root of the SD card or /rw/luma on CTRNAND and disabling this option.-->
|
||||||
|
|
||||||
Use custom path: ( )
|
|
||||||
|
|
||||||
Enable game patching: ( )
|
Enable game patching: ( )
|
||||||
|
|
||||||
@@ -65,6 +65,8 @@ Patch ARM9 access: ( )
|
|||||||
|
|
||||||
Set developer UNITINFO: ( )
|
Set developer UNITINFO: ( )
|
||||||
|
|
||||||
|
Disable ARM11 exception handlers: ( )
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
||||||
|
|
||||||
@@ -83,6 +85,6 @@ Set developer UNITINFO: ( )
|
|||||||
|
|
||||||
|
|
||||||
**Dump file:**
|
**Dump file:**
|
||||||
<!--If the issue leads to a crash you can generate a crash dump by checking the "Enable exception handlers" option.
|
<!--If the issue leads to a crash you must uncheck the "Disable ARM11 exception handlers" option.
|
||||||
-- The error message will tell you where the dump is.
|
-- The error message will tell you where the dump is.
|
||||||
-- Zip the dmp file and drag & drop it below.-->
|
-- Zip the dmp file and drag & drop it below.-->
|
||||||
|
|||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -14,3 +14,7 @@ exceptions/arm11/build
|
|||||||
*.elf
|
*.elf
|
||||||
*.cxi
|
*.cxi
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
*.dmp
|
||||||
|
.project
|
||||||
|
.cproject
|
||||||
|
.settings
|
||||||
|
|||||||
28
Makefile
28
Makefile
@@ -10,13 +10,6 @@ endif
|
|||||||
|
|
||||||
include $(DEVKITARM)/base_tools
|
include $(DEVKITARM)/base_tools
|
||||||
|
|
||||||
UNAME_S := $(shell uname -s)
|
|
||||||
ifeq ($(UNAME_S),Darwin)
|
|
||||||
size := stat -f%z
|
|
||||||
else
|
|
||||||
size := stat -c%s
|
|
||||||
endif
|
|
||||||
|
|
||||||
name := Luma3DS
|
name := Luma3DS
|
||||||
revision := $(shell git describe --tags --match v[0-9]* --abbrev=8 | sed 's/-[0-9]*-g/-/')
|
revision := $(shell git describe --tags --match v[0-9]* --abbrev=8 | sed 's/-[0-9]*-g/-/')
|
||||||
version_major := $(shell git describe --tags --match v[0-9]* | cut -c2- | cut -f1 -d- | cut -f1 -d.)
|
version_major := $(shell git describe --tags --match v[0-9]* | cut -c2- | cut -f1 -d- | cut -f1 -d.)
|
||||||
@@ -54,6 +47,8 @@ dir_k11_extension := k11_extension
|
|||||||
dir_sysmodules := sysmodules
|
dir_sysmodules := sysmodules
|
||||||
dir_loader := $(dir_sysmodules)/loader
|
dir_loader := $(dir_sysmodules)/loader
|
||||||
dir_rosalina := $(dir_sysmodules)/rosalina
|
dir_rosalina := $(dir_sysmodules)/rosalina
|
||||||
|
dir_sm := $(dir_sysmodules)/sm
|
||||||
|
dir_pxi := $(dir_sysmodules)/pxi
|
||||||
dir_build := build
|
dir_build := build
|
||||||
dir_out := out
|
dir_out := out
|
||||||
|
|
||||||
@@ -67,7 +62,7 @@ objects = $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \
|
|||||||
|
|
||||||
bundled = $(dir_build)/reboot.bin.o $(dir_build)/emunand.bin.o $(dir_build)/chainloader.bin.o $(dir_build)/arm9_exceptions.bin.o
|
bundled = $(dir_build)/reboot.bin.o $(dir_build)/emunand.bin.o $(dir_build)/chainloader.bin.o $(dir_build)/arm9_exceptions.bin.o
|
||||||
|
|
||||||
modules = $(dir_build)/loader.cxi $(dir_build)/rosalina.cxi
|
modules = $(dir_build)/loader.cxi $(dir_build)/rosalina.cxi $(dir_build)/sm.cxi $(dir_build)/pxi.cxi
|
||||||
|
|
||||||
define bin2o
|
define bin2o
|
||||||
bin2s $< | $(AS) -o $(@)
|
bin2s $< | $(AS) -o $(@)
|
||||||
@@ -90,6 +85,8 @@ clean:
|
|||||||
@$(MAKE) -C $(dir_k11_extension) clean
|
@$(MAKE) -C $(dir_k11_extension) clean
|
||||||
@$(MAKE) -C $(dir_loader) clean
|
@$(MAKE) -C $(dir_loader) clean
|
||||||
@$(MAKE) -C $(dir_rosalina) clean
|
@$(MAKE) -C $(dir_rosalina) clean
|
||||||
|
@$(MAKE) -C $(dir_sm) clean
|
||||||
|
@$(MAKE) -C $(dir_pxi) clean
|
||||||
@rm -rf $(dir_out) $(dir_build)
|
@rm -rf $(dir_out) $(dir_build)
|
||||||
|
|
||||||
.PRECIOUS: $(dir_build)/%.bin
|
.PRECIOUS: $(dir_build)/%.bin
|
||||||
@@ -100,10 +97,13 @@ clean:
|
|||||||
.PHONY: $(dir_k11_extension)
|
.PHONY: $(dir_k11_extension)
|
||||||
.PHONY: $(dir_loader)
|
.PHONY: $(dir_loader)
|
||||||
.PHONY: $(dir_rosalina)
|
.PHONY: $(dir_rosalina)
|
||||||
|
.PHONY: $(dir_sm)
|
||||||
|
.PHONY: $(dir_pxi)
|
||||||
|
|
||||||
|
|
||||||
$(dir_out)/$(name)$(revision).7z: all
|
$(dir_out)/$(name)$(revision).7z: all
|
||||||
@mkdir -p "$(@D)"
|
@mkdir -p "$(@D)"
|
||||||
@7z a -mx $@ ./$(@D)/* ./$(dir_exceptions)/exception_dump_parser.py
|
@[ -f "$@" ] || 7z a -mx $@ ./$(@D)/* ./$(dir_exceptions)/exception_dump_parser -xr!.DS_Store
|
||||||
|
|
||||||
$(dir_out)/boot.firm: $(dir_build)/modules.bin $(dir_build)/arm11.elf $(dir_build)/main.elf $(dir_build)/k11_extension.bin
|
$(dir_out)/boot.firm: $(dir_build)/modules.bin $(dir_build)/arm11.elf $(dir_build)/main.elf $(dir_build)/k11_extension.bin
|
||||||
@mkdir -p "$(@D)"
|
@mkdir -p "$(@D)"
|
||||||
@@ -132,6 +132,14 @@ $(dir_build)/rosalina.cxi: $(dir_rosalina)
|
|||||||
@mkdir -p "$(@D)"
|
@mkdir -p "$(@D)"
|
||||||
@$(MAKE) -C $<
|
@$(MAKE) -C $<
|
||||||
|
|
||||||
|
$(dir_build)/sm.cxi: $(dir_sm)
|
||||||
|
@mkdir -p "$(@D)"
|
||||||
|
@$(MAKE) -C $<
|
||||||
|
|
||||||
|
$(dir_build)/pxi.cxi: $(dir_pxi)
|
||||||
|
@mkdir -p "$(@D)"
|
||||||
|
@$(MAKE) -C $<
|
||||||
|
|
||||||
$(dir_build)/%.bin.o: $(dir_build)/%.bin
|
$(dir_build)/%.bin.o: $(dir_build)/%.bin
|
||||||
@$(bin2o)
|
@$(bin2o)
|
||||||
|
|
||||||
@@ -152,7 +160,7 @@ $(dir_build)/config.o: CFLAGS += -DCONFIG_TITLE="\"$(name) $(revision) configura
|
|||||||
$(dir_build)/patches.o: CFLAGS += -DVERSION_MAJOR="$(version_major)" -DVERSION_MINOR="$(version_minor)"\
|
$(dir_build)/patches.o: CFLAGS += -DVERSION_MAJOR="$(version_major)" -DVERSION_MINOR="$(version_minor)"\
|
||||||
-DVERSION_BUILD="$(version_build)" -DISRELEASE="$(is_release)" -DCOMMIT_HASH="0x$(commit)"
|
-DVERSION_BUILD="$(version_build)" -DISRELEASE="$(is_release)" -DCOMMIT_HASH="0x$(commit)"
|
||||||
$(dir_build)/firm.o: $(dir_build)/modules.bin
|
$(dir_build)/firm.o: $(dir_build)/modules.bin
|
||||||
$(dir_build)/firm.o: CFLAGS += -DLUMA_SECTION0_SIZE="$(shell $(size) $(dir_build)/modules.bin)"
|
$(dir_build)/firm.o: CFLAGS += -DLUMA_SECTION0_SIZE="$(shell wc -c $(dir_build)/modules.bin | tr -d [:space:][:alpha:][:punct:])"
|
||||||
|
|
||||||
$(dir_build)/bundled.h: $(bundled)
|
$(dir_build)/bundled.h: $(bundled)
|
||||||
@$(foreach f, $(bundled),\
|
@$(foreach f, $(bundled),\
|
||||||
|
|||||||
10
README.md
10
README.md
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
**Luma3DS** is a program to patch the system software of (New) Nintendo 3DS handheld consoles "on the fly", adding features (such as per-game language settings and debugging capabilities for developers) and removing restrictions enforced by Nintendo (such as the region lock).
|
**Luma3DS** is a program to patch the system software of (New) Nintendo 3DS handheld consoles "on the fly", adding features (such as per-game language settings and debugging capabilities for developers) and removing restrictions enforced by Nintendo (such as the region lock).
|
||||||
It also allows you to run unauthorized ("homebrew") content by removing signature checks.
|
It also allows you to run unauthorized ("homebrew") content by removing signature checks.
|
||||||
To use it, you will need a console capable of running homebrew software on the ARM9 processor. We recommend [Plailect's guide](https://3ds.guide/) for details on how to get your system ready.
|
To use it, you will need a console capable of running homebrew software on the ARM9 processor. We recommend [Plailect's guide](https://3ds.hacks.guide/) for details on how to get your system ready.
|
||||||
|
|
||||||
Since Luma3DS v8.0, Luma3DS has its own in-game menu, triggerable by `L+Down+Select` (see the [release notes](https://github.com/AuroraWright/Luma3DS/releases/tag/v8.0)).
|
Since Luma3DS v8.0, Luma3DS has its own in-game menu, triggerable by `L+Down+Select` (see the [release notes](https://github.com/AuroraWright/Luma3DS/releases/tag/v8.0)).
|
||||||
|
|
||||||
@@ -15,9 +15,9 @@ Since Luma3DS v8.0, Luma3DS has its own in-game menu, triggerable by `L+Down+Sel
|
|||||||
|
|
||||||
First you need to clone the repository with: `git clone https://github.com/AuroraWright/Luma3DS.git`
|
First you need to clone the repository with: `git clone https://github.com/AuroraWright/Luma3DS.git`
|
||||||
To compile, you'll need [armips](https://github.com/Kingcom/armips) and a build of a recent commit of [makerom](https://github.com/profi200/Project_CTR) added to your PATH. You'll also need to install [firmtool](https://github.com/TuxSH/firmtool), its README contains installation instructions.
|
To compile, you'll need [armips](https://github.com/Kingcom/armips) and a build of a recent commit of [makerom](https://github.com/profi200/Project_CTR) added to your PATH. You'll also need to install [firmtool](https://github.com/TuxSH/firmtool), its README contains installation instructions.
|
||||||
For now, you'll also need to update your [libctru](https://github.com/smealum/ctrulib) install, building from the latest commit.
|
You'll also need to update your [libctru](https://github.com/smealum/ctrulib) install, building from the latest commit.
|
||||||
For your convenience, here are [Windows](http://www91.zippyshare.com/v/ePGpjk9r/file.html) and [Linux](https://mega.nz/#!uQ1T1IAD!Q91O0e12LXKiaXh_YjXD3D5m8_W3FuMI-hEa6KVMRDQ) builds of armips (thanks to who compiled them!).
|
Here are [Windows](https://buildbot.orphis.net/armips/) and [Linux](https://ev1l0rd.s-ul.eu/mEIk4atQ) builds of armips (thanks to who compiled them!).
|
||||||
Finally just run `make` and everything should work!
|
Run `make` and everything should work!
|
||||||
You can find the compiled files in the `out` folder.
|
You can find the compiled files in the `out` folder.
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -38,3 +38,5 @@ See https://github.com/AuroraWright/Luma3DS/wiki/Credits
|
|||||||
|
|
||||||
This software is licensed under the terms of the GPLv3.
|
This software is licensed under the terms of the GPLv3.
|
||||||
You can find a copy of the license in the LICENSE.txt file.
|
You can find a copy of the license in the LICENSE.txt file.
|
||||||
|
|
||||||
|
You can also use all of `sysmodules/rosalina/include/gdb/`, all of `sysmodules/rosalina/source/gdb/`, `sysmodules/rosalina/include/gdb.h`, `sysmodules/rosalina/source/gdb.c`, `sysmodules/rosalina/include/sock_util.h` and `sysmodules/rosalina/source/sock_util.c` under the terms of the GPLv2, as an option. If you choose to do so, you needn't include the GPLv3 notices that are present in the beginning of each of these files.
|
||||||
|
|||||||
@@ -11,6 +11,6 @@ SECTIONS
|
|||||||
.data : ALIGN(4) { *(.data*); . = ALIGN(4); }
|
.data : ALIGN(4) { *(.data*); . = ALIGN(4); }
|
||||||
.bss : ALIGN(8) { __bss_start = .; *(.bss* COMMON); . = ALIGN(8); __bss_end = .; }
|
.bss : ALIGN(8) { __bss_start = .; *(.bss* COMMON); . = ALIGN(8); __bss_end = .; }
|
||||||
|
|
||||||
__stack_top__ = 0x1FFFF000;
|
__stack_top__ = 0x1FFFE000;
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -120,6 +120,16 @@ static void initScreens(u32 brightnessLevel, struct fb *fbs)
|
|||||||
*(vu32 *)0x10400584 = 0x10101 * i;
|
*(vu32 *)0x10400584 = 0x10101 * i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setupFramebuffers(struct fb *fbs)
|
||||||
|
{
|
||||||
|
*(vu32 *)0x10400468 = (u32)fbs[0].top_left;
|
||||||
|
*(vu32 *)0x1040046c = (u32)fbs[1].top_left;
|
||||||
|
*(vu32 *)0x10400494 = (u32)fbs[0].top_right;
|
||||||
|
*(vu32 *)0x10400498 = (u32)fbs[1].top_right;
|
||||||
|
*(vu32 *)0x10400568 = (u32)fbs[0].bottom;
|
||||||
|
*(vu32 *)0x1040056c = (u32)fbs[1].bottom;
|
||||||
|
}
|
||||||
|
|
||||||
static void clearScreens(struct fb *fb)
|
static void clearScreens(struct fb *fb)
|
||||||
{
|
{
|
||||||
//Setting up two simultaneous memory fills using the GPU
|
//Setting up two simultaneous memory fills using the GPU
|
||||||
@@ -175,6 +185,9 @@ void main(void)
|
|||||||
case INIT_SCREENS:
|
case INIT_SCREENS:
|
||||||
initScreens(*(vu32 *)ARM11_PARAMETERS_ADDRESS, (struct fb *)(ARM11_PARAMETERS_ADDRESS + 4));
|
initScreens(*(vu32 *)ARM11_PARAMETERS_ADDRESS, (struct fb *)(ARM11_PARAMETERS_ADDRESS + 4));
|
||||||
break;
|
break;
|
||||||
|
case SETUP_FRAMEBUFFERS:
|
||||||
|
setupFramebuffers((struct fb *)ARM11_PARAMETERS_ADDRESS);
|
||||||
|
break;
|
||||||
case CLEAR_SCREENS:
|
case CLEAR_SCREENS:
|
||||||
clearScreens((struct fb *)ARM11_PARAMETERS_ADDRESS);
|
clearScreens((struct fb *)ARM11_PARAMETERS_ADDRESS);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
@
|
@
|
||||||
@ This program is free software: you can redistribute it and/or modify
|
@ This program is free software: you can redistribute it and/or modify
|
||||||
@ it under the terms of the GNU General Public License as published by
|
@ it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -50,11 +50,12 @@ struct fb {
|
|||||||
u8 *top_left;
|
u8 *top_left;
|
||||||
u8 *top_right;
|
u8 *top_right;
|
||||||
u8 *bottom;
|
u8 *bottom;
|
||||||
} __attribute__((packed));
|
};
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
INIT_SCREENS = 0,
|
INIT_SCREENS = 0,
|
||||||
|
SETUP_FRAMEBUFFERS,
|
||||||
CLEAR_SCREENS,
|
CLEAR_SCREENS,
|
||||||
SWAP_FRAMEBUFFERS,
|
SWAP_FRAMEBUFFERS,
|
||||||
UPDATE_BRIGHTNESS,
|
UPDATE_BRIGHTNESS,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
@
|
@
|
||||||
@ This program is free software: you can redistribute it and/or modify
|
@ This program is free software: you can redistribute it and/or modify
|
||||||
@ it under the terms of the GNU General Public License as published by
|
@ it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
@
|
@
|
||||||
@ This program is free software: you can redistribute it and/or modify
|
@ This program is free software: you can redistribute it and/or modify
|
||||||
@ it under the terms of the GNU General Public License as published by
|
@ it under the terms of the GNU General Public License as published by
|
||||||
@@ -56,5 +56,5 @@ disableMpuAndJumpToEntrypoints:
|
|||||||
@ Jump to the ARM9 entrypoint
|
@ Jump to the ARM9 entrypoint
|
||||||
mov r0, r4
|
mov r0, r4
|
||||||
mov r1, r5
|
mov r1, r5
|
||||||
ldr r2, =0x2BEEF
|
ldr r2, =0x3BEEF
|
||||||
bx r6
|
bx r6
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -42,4 +42,4 @@ struct fb {
|
|||||||
u8 *top_left;
|
u8 *top_left;
|
||||||
u8 *top_right;
|
u8 *top_right;
|
||||||
u8 *bottom;
|
u8 *bottom;
|
||||||
} __attribute__((packed));
|
};
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ dir_build := build
|
|||||||
dir_out := ../../$(dir_build)
|
dir_out := ../../$(dir_build)
|
||||||
|
|
||||||
ASFLAGS := -mcpu=arm946e-s
|
ASFLAGS := -mcpu=arm946e-s
|
||||||
CFLAGS := -Wall -Wextra -mthumb $(ASFLAGS) -fno-builtin -std=c11 -Wno-main -O2 -flto -ffast-math
|
CFLAGS := -Wall -Wextra -marm $(ASFLAGS) -fno-builtin -std=c11 -Wno-main -Os -ffast-math
|
||||||
LDFLAGS := -nostdlib
|
LDFLAGS := -nostartfiles -Wl,--nmagic
|
||||||
|
|
||||||
objects = $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \
|
objects = $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \
|
||||||
$(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \
|
$(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ OUTPUT_ARCH(arm)
|
|||||||
ENTRY(_start)
|
ENTRY(_start)
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
. = 0x01FF7FE0;
|
. = 0x01FF8000;
|
||||||
|
|
||||||
.text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); }
|
.text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); }
|
||||||
.rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); }
|
.rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); }
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -43,8 +43,9 @@ typedef struct __attribute__((packed))
|
|||||||
u32 additionalDataSize;
|
u32 additionalDataSize;
|
||||||
} ExceptionDumpHeader;
|
} ExceptionDumpHeader;
|
||||||
|
|
||||||
u32 readMPUConfig(u32 *regionSettings);
|
|
||||||
void FIQHandler(void);
|
void FIQHandler(void);
|
||||||
void undefinedInstructionHandler(void);
|
void undefinedInstructionHandler(void);
|
||||||
void dataAbortHandler(void);
|
void dataAbortHandler(void);
|
||||||
void prefetchAbortHandler(void);
|
void prefetchAbortHandler(void);
|
||||||
|
|
||||||
|
u32 safecpy(void *dst, const void *src, u32 len);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
@
|
@
|
||||||
@ This program is free software: you can redistribute it and/or modify
|
@ This program is free software: you can redistribute it and/or modify
|
||||||
@ it under the terms of the GNU General Public License as published by
|
@ it under the terms of the GNU General Public License as published by
|
||||||
@@ -22,92 +22,131 @@
|
|||||||
@ or requiring that modified versions of such material be marked in
|
@ or requiring that modified versions of such material be marked in
|
||||||
@ reasonable ways as different from the original version.
|
@ reasonable ways as different from the original version.
|
||||||
|
|
||||||
.macro GEN_HANDLER name
|
.macro GEN_USUAL_HANDLER name, index
|
||||||
.global \name
|
\name\()Handler:
|
||||||
.type \name, %function
|
ldr sp, =_regs
|
||||||
\name:
|
stmia sp, {r0-r7}
|
||||||
ldr sp, =#0x02000000 @ We make the (full descending) stack point to the end of ITCM for our exception handlers.
|
|
||||||
@ It doesn't matter if we're overwriting stuff here, since we're going to reboot.
|
|
||||||
|
|
||||||
stmfd sp!, {r0-r7} @ FIQ has its own r8-r14 regs
|
mov r0, #\index
|
||||||
ldr r1, =\@ @ macro expansion counter
|
|
||||||
b _commonHandler
|
b _commonHandler
|
||||||
|
|
||||||
.size \name, . - \name
|
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.arm
|
.arm
|
||||||
.align 4
|
.balign 4
|
||||||
|
|
||||||
.global _commonHandler
|
.global _commonHandler
|
||||||
.type _commonHandler, %function
|
.type _commonHandler, %function
|
||||||
_commonHandler:
|
_commonHandler:
|
||||||
|
mov r1, r0
|
||||||
|
mov r0, sp
|
||||||
mrs r2, spsr
|
mrs r2, spsr
|
||||||
mov r6, sp
|
|
||||||
mrs r3, cpsr
|
mrs r3, cpsr
|
||||||
|
add r6, r0, #(8 * 4)
|
||||||
|
|
||||||
orr r3, #0x1c0 @ disable Imprecise Aborts, IRQ and FIQ (equivalent to "cpsid aif" on arm11)
|
orr r3, #0xc0 @ mask interrupts
|
||||||
msr cpsr_cx, r3
|
msr cpsr_cx, r3
|
||||||
|
|
||||||
tst r2, #0x20
|
|
||||||
bne noSvcBreak
|
|
||||||
cmp r1, #2
|
|
||||||
bne noSvcBreak
|
|
||||||
|
|
||||||
sub r0, lr, #4 @ calling cannotAccessAddress cause more problems that it actually solves... (I've to save a lot of regs and that's a pain tbh)
|
|
||||||
lsr r0, #20 @ we'll just do some address checks (to see if it's in ARM9 internal memory)
|
|
||||||
cmp r0, #0x80
|
|
||||||
bne noSvcBreak
|
|
||||||
ldr r4, [lr, #-4]
|
|
||||||
ldr r5, =#0xe12fff7f
|
|
||||||
cmp r4, r5
|
|
||||||
bne noSvcBreak
|
|
||||||
bic r5, r3, #0xf
|
|
||||||
orr r5, #0x3
|
|
||||||
msr cpsr_c, r5 @ switch to supervisor mode
|
|
||||||
ldmfd sp, {r8-r11}^
|
|
||||||
ldr r2, [sp, #0x1c] @ implementation details of the official svc handler
|
|
||||||
ldr r4, [sp, #0x18]
|
|
||||||
msr cpsr_c, r3 @ restore processor mode
|
|
||||||
tst r2, #0x20
|
|
||||||
addne lr, r4, #2 @ adjust address for later
|
|
||||||
moveq lr, r4
|
|
||||||
|
|
||||||
noSvcBreak:
|
|
||||||
ands r4, r2, #0xf @ get the mode that triggered the exception
|
ands r4, r2, #0xf @ get the mode that triggered the exception
|
||||||
moveq r4, #0xf @ usr => sys
|
moveq r4, #0xf @ usr => sys
|
||||||
bic r5, r3, #0xf
|
bic r5, r3, #0xf
|
||||||
orr r5, r4
|
orr r5, r4
|
||||||
msr cpsr_c, r5 @ change processor mode
|
msr cpsr_c, r5 @ change processor mode
|
||||||
stmfd r6!, {r8-lr}
|
stmia r6!, {r8-lr}
|
||||||
msr cpsr_c, r3 @ restore processor mode
|
msr cpsr_c, r3 @ restore processor mode
|
||||||
mov sp, r6
|
|
||||||
|
|
||||||
stmfd sp!, {r2,lr} @ it's a bit of a mess, but we will fix that later
|
str lr, [r6], #4
|
||||||
@ order of saved regs now: cpsr, pc + (2/4/8), r8-r14, r0-r7
|
str r2, [r6]
|
||||||
|
|
||||||
mov r0, sp
|
|
||||||
|
|
||||||
|
msr cpsr_cxsf, #0xdf @ finally, switch to system mode, mask interrupts and clear flags (in case of double faults)
|
||||||
|
ldr sp, =0x02000000
|
||||||
b mainHandler
|
b mainHandler
|
||||||
|
|
||||||
GEN_HANDLER FIQHandler
|
|
||||||
GEN_HANDLER undefinedInstructionHandler
|
|
||||||
GEN_HANDLER prefetchAbortHandler
|
|
||||||
GEN_HANDLER dataAbortHandler
|
|
||||||
|
|
||||||
.global readMPUConfig
|
.global FIQHandler
|
||||||
.type readMPUConfig, %function
|
.type FIQHandler, %function
|
||||||
readMPUConfig:
|
GEN_USUAL_HANDLER FIQ, 0
|
||||||
stmfd sp!, {r4-r8, lr}
|
|
||||||
mrc p15,0,r1,c6,c0,0
|
.global undefinedInstructionHandler
|
||||||
mrc p15,0,r2,c6,c1,0
|
.type undefinedInstructionHandler, %function
|
||||||
mrc p15,0,r3,c6,c2,0
|
GEN_USUAL_HANDLER undefinedInstruction, 1
|
||||||
mrc p15,0,r4,c6,c3,0
|
|
||||||
mrc p15,0,r5,c6,c4,0
|
.global prefetchAbortHandler
|
||||||
mrc p15,0,r6,c6,c5,0
|
.type prefetchAbortHandler, %function
|
||||||
mrc p15,0,r7,c6,c6,0
|
prefetchAbortHandler:
|
||||||
mrc p15,0,r8,c6,c7,0
|
msr cpsr_cx, #0xd7 @ mask interrupts (abort mode)
|
||||||
stmia r0, {r1-r8}
|
mrs sp, spsr
|
||||||
mrc p15,0,r0,c5,c0,2 @ read data access permission bits
|
and sp, #0x3f
|
||||||
ldmfd sp!, {r4-r8, pc}
|
cmp sp, #0x13
|
||||||
|
bne _prefetchAbortNormalHandler
|
||||||
|
|
||||||
|
ldr sp, =BreakPtr
|
||||||
|
ldr sp, [sp]
|
||||||
|
cmp sp, #0
|
||||||
|
beq _prefetchAbortNormalHandler
|
||||||
|
add sp, #(1*4 + 4)
|
||||||
|
cmp lr, sp
|
||||||
|
bne _prefetchAbortNormalHandler
|
||||||
|
|
||||||
|
mov sp, r8
|
||||||
|
pop {r8-r11}
|
||||||
|
ldr lr, [sp, #8]!
|
||||||
|
ldr sp, [sp, #4]
|
||||||
|
msr spsr_cxsf, sp
|
||||||
|
tst sp, #0x20
|
||||||
|
addne lr, #2 @ adjust address for later
|
||||||
|
|
||||||
|
GEN_USUAL_HANDLER _prefetchAbortNormal, 2
|
||||||
|
|
||||||
|
.global dataAbortHandler
|
||||||
|
.type dataAbortHandler, %function
|
||||||
|
dataAbortHandler:
|
||||||
|
msr cpsr_cx, #0xd7 @ mask interrupts (abort mode)
|
||||||
|
mrs sp, spsr
|
||||||
|
and sp, #0x3f
|
||||||
|
cmp sp, #0x1f
|
||||||
|
bne _dataAbortNormalHandler
|
||||||
|
|
||||||
|
sub lr, #8
|
||||||
|
adr sp, safecpy
|
||||||
|
cmp lr, sp
|
||||||
|
blo _j_dataAbortNormalHandler
|
||||||
|
adr sp, _safecpy_end
|
||||||
|
cmp lr, sp
|
||||||
|
bhs _j_dataAbortNormalHandler
|
||||||
|
|
||||||
|
msr spsr_f, #(1 << 30)
|
||||||
|
mov r12, #0
|
||||||
|
adds pc, lr, #4
|
||||||
|
|
||||||
|
_j_dataAbortNormalHandler:
|
||||||
|
add lr, #8
|
||||||
|
|
||||||
|
GEN_USUAL_HANDLER _dataAbortNormal, 3
|
||||||
|
|
||||||
|
|
||||||
|
.global safecpy
|
||||||
|
.type safecpy, %function
|
||||||
|
safecpy:
|
||||||
|
push {r4, lr}
|
||||||
|
mov r3, #0
|
||||||
|
movs r12, #1
|
||||||
|
|
||||||
|
_safecpy_loop:
|
||||||
|
ldrb r4, [r1, r3]
|
||||||
|
cmp r12, #0
|
||||||
|
beq _safecpy_loop_end
|
||||||
|
strb r4, [r0, r3]
|
||||||
|
add r3, #1
|
||||||
|
cmp r3, r2
|
||||||
|
blo _safecpy_loop
|
||||||
|
|
||||||
|
_safecpy_loop_end:
|
||||||
|
mov r0, r3
|
||||||
|
pop {r4, pc}
|
||||||
|
|
||||||
|
_safecpy_end:
|
||||||
|
|
||||||
|
.bss
|
||||||
|
.balign 4
|
||||||
|
_regs: .skip (4 * 17)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -32,48 +32,10 @@
|
|||||||
#define REG_DUMP_SIZE 4 * 17
|
#define REG_DUMP_SIZE 4 * 17
|
||||||
#define CODE_DUMP_SIZE 48
|
#define CODE_DUMP_SIZE 48
|
||||||
|
|
||||||
bool cannotAccessAddress(const void *address)
|
void __attribute__((noreturn)) mainHandler(u32 *registerDump, u32 type)
|
||||||
{
|
|
||||||
u32 regionSettings[8];
|
|
||||||
u32 addr = (u32)address;
|
|
||||||
|
|
||||||
u32 dataAccessPermissions = readMPUConfig(regionSettings);
|
|
||||||
for(u32 i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
if((dataAccessPermissions & 0xF) == 0 || (regionSettings[i] & 1) == 0)
|
|
||||||
continue; //No access / region not enabled
|
|
||||||
|
|
||||||
u32 regionAddrBase = regionSettings[i] & ~0xFFF;
|
|
||||||
u32 regionSize = 1 << (((regionSettings[i] >> 1) & 0x1F) + 1);
|
|
||||||
|
|
||||||
if(addr >= regionAddrBase && addr < regionAddrBase + regionSize)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
dataAccessPermissions >>= 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static u32 __attribute__((noinline)) copyMemory(void *dst, const void *src, u32 size, u32 alignment)
|
|
||||||
{
|
|
||||||
u8 *out = (u8 *)dst;
|
|
||||||
const u8 *in = (const u8 *)src;
|
|
||||||
|
|
||||||
if(((u32)src & (alignment - 1)) != 0 || cannotAccessAddress(src) || (size != 0 && cannotAccessAddress((u8 *)src + size - 1)))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for(u32 i = 0; i < size; i++)
|
|
||||||
*out++ = *in++;
|
|
||||||
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
void __attribute__((noreturn)) mainHandler(u32 *regs, u32 type)
|
|
||||||
{
|
{
|
||||||
ExceptionDumpHeader dumpHeader;
|
ExceptionDumpHeader dumpHeader;
|
||||||
|
|
||||||
u32 registerDump[REG_DUMP_SIZE / 4];
|
|
||||||
u8 codeDump[CODE_DUMP_SIZE];
|
u8 codeDump[CODE_DUMP_SIZE];
|
||||||
|
|
||||||
dumpHeader.magic[0] = 0xDEADC0DE;
|
dumpHeader.magic[0] = 0xDEADC0DE;
|
||||||
@@ -89,34 +51,32 @@ void __attribute__((noreturn)) mainHandler(u32 *regs, u32 type)
|
|||||||
dumpHeader.codeDumpSize = CODE_DUMP_SIZE;
|
dumpHeader.codeDumpSize = CODE_DUMP_SIZE;
|
||||||
dumpHeader.additionalDataSize = 0;
|
dumpHeader.additionalDataSize = 0;
|
||||||
|
|
||||||
//Dump registers
|
u32 cpsr = registerDump[16];
|
||||||
//Current order of saved regs: cpsr, pc, r8-r14, r0-r7
|
u32 pc = registerDump[15] - (type < 3 ? (((cpsr & 0x20) != 0 && type == 1) ? 2 : 4) : 8);
|
||||||
u32 cpsr = regs[0];
|
|
||||||
u32 pc = regs[1] - (type < 3 ? (((cpsr & 0x20) != 0 && type == 1) ? 2 : 4) : 8);
|
|
||||||
|
|
||||||
registerDump[15] = pc;
|
registerDump[15] = pc;
|
||||||
registerDump[16] = cpsr;
|
|
||||||
for(u32 i = 0; i < 7; i++) registerDump[8 + i] = regs[2 + i];
|
|
||||||
for(u32 i = 0; i < 8; i++) registerDump[i] = regs[9 + i];
|
|
||||||
|
|
||||||
//Dump code
|
//Dump code
|
||||||
u8 *instr = (u8 *)pc + ((cpsr & 0x20) ? 2 : 4) - dumpHeader.codeDumpSize; //Doesn't work well on 32-bit Thumb instructions, but it isn't much of a problem
|
u8 *instr = (u8 *)pc + ((cpsr & 0x20) ? 2 : 4) - dumpHeader.codeDumpSize; //wouldn't work well on 32-bit Thumb instructions, but it isn't much of a problem
|
||||||
dumpHeader.codeDumpSize = copyMemory(codeDump, instr, dumpHeader.codeDumpSize, ((cpsr & 0x20) != 0) ? 2 : 4);
|
dumpHeader.codeDumpSize = ((u32)instr & (((cpsr & 0x20) != 0) ? 1 : 3)) != 0 ? 0 : safecpy(codeDump, instr, dumpHeader.codeDumpSize);
|
||||||
|
|
||||||
//Copy register dump and code dump
|
//Copy register dump and code dump
|
||||||
u8 *final = (u8 *)(FINAL_BUFFER + sizeof(ExceptionDumpHeader));
|
u8 *final = (u8 *)(FINAL_BUFFER + sizeof(ExceptionDumpHeader));
|
||||||
final += copyMemory(final, registerDump, dumpHeader.registerDumpSize, 1);
|
final += safecpy(final, registerDump, dumpHeader.registerDumpSize);
|
||||||
final += copyMemory(final, codeDump, dumpHeader.codeDumpSize, 1);
|
final += safecpy(final, codeDump, dumpHeader.codeDumpSize);
|
||||||
|
|
||||||
//Dump stack in place
|
//Dump stack in place
|
||||||
dumpHeader.stackDumpSize = copyMemory(final, (const void *)registerDump[13], 0x1000 - (registerDump[13] & 0xFFF), 1);
|
dumpHeader.stackDumpSize = safecpy(final, (const void *)registerDump[13], 0x1000 - (registerDump[13] & 0xFFF));
|
||||||
|
|
||||||
dumpHeader.totalSize = sizeof(ExceptionDumpHeader) + dumpHeader.registerDumpSize + dumpHeader.codeDumpSize + dumpHeader.stackDumpSize + dumpHeader.additionalDataSize;
|
dumpHeader.totalSize = sizeof(ExceptionDumpHeader) + dumpHeader.registerDumpSize + dumpHeader.codeDumpSize + dumpHeader.stackDumpSize + dumpHeader.additionalDataSize;
|
||||||
|
|
||||||
//Copy header (actually optimized by the compiler)
|
//Copy header (actually optimized by the compiler)
|
||||||
*(ExceptionDumpHeader *)FINAL_BUFFER = dumpHeader;
|
*(ExceptionDumpHeader *)FINAL_BUFFER = dumpHeader;
|
||||||
|
|
||||||
|
if(ARESCREENSINITIALIZED) i2cWriteRegister(I2C_DEV_MCU, 0x22, 1 << 0); //Shutdown LCD
|
||||||
|
|
||||||
((void (*)())0xFFFF0830)(); //Ensure that all memory transfers have completed and that the data cache has been flushed
|
((void (*)())0xFFFF0830)(); //Ensure that all memory transfers have completed and that the data cache has been flushed
|
||||||
|
|
||||||
i2cWriteRegister(I2C_DEV_MCU, 0x20, 1 << 2); //Reboot
|
i2cWriteRegister(I2C_DEV_MCU, 0x20, 1 << 2); //Reboot
|
||||||
while(true);
|
while(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
@
|
@
|
||||||
@ This program is free software: you can redistribute it and/or modify
|
@ This program is free software: you can redistribute it and/or modify
|
||||||
@ it under the terms of the GNU General Public License as published by
|
@ it under the terms of the GNU General Public License as published by
|
||||||
@@ -26,8 +26,12 @@
|
|||||||
.align 4
|
.align 4
|
||||||
.global _start
|
.global _start
|
||||||
_start:
|
_start:
|
||||||
add pc, r0, #(handlers - .) @ Dummy instruction to prevent compiler optimizations
|
add pc, r0, #(handlers - .) @ Dummy instruction
|
||||||
|
|
||||||
|
.global BreakPtr
|
||||||
|
BreakPtr: .word 0
|
||||||
|
|
||||||
|
.global handlers
|
||||||
handlers:
|
handlers:
|
||||||
.word FIQHandler
|
.word FIQHandler
|
||||||
.word undefinedInstructionHandler
|
.word undefinedInstructionHandler
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -39,3 +39,7 @@ typedef volatile u8 vu8;
|
|||||||
typedef volatile u16 vu16;
|
typedef volatile u16 vu16;
|
||||||
typedef volatile u32 vu32;
|
typedef volatile u32 vu32;
|
||||||
typedef volatile u64 vu64;
|
typedef volatile u64 vu64;
|
||||||
|
|
||||||
|
#define PDN_GPU_CNT (*(vu8 *)0x10141200)
|
||||||
|
|
||||||
|
#define ARESCREENSINITIALIZED (PDN_GPU_CNT != 1)
|
||||||
|
|||||||
27
exceptions/exception_dump_parser.py → exceptions/exception_dump_parser/luma3ds_exception_dump_parser/__main__.py
Normal file → Executable file
27
exceptions/exception_dump_parser.py → exceptions/exception_dump_parser/luma3ds_exception_dump_parser/__main__.py
Normal file → Executable file
@@ -2,7 +2,7 @@
|
|||||||
# Requires Python >= 3.2 or >= 2.7
|
# Requires Python >= 3.2 or >= 2.7
|
||||||
|
|
||||||
# This file is part of Luma3DS
|
# This file is part of Luma3DS
|
||||||
# Copyright (C) 2016 Aurora Wright, TuxSH
|
# Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -90,8 +90,15 @@ def makeRegisterLine(A, rA, B, rB):
|
|||||||
handledExceptionNames = ("FIQ", "undefined instruction", "prefetch abort", "data abort")
|
handledExceptionNames = ("FIQ", "undefined instruction", "prefetch abort", "data abort")
|
||||||
registerNames = tuple("r{0}".format(i) for i in range(13)) + ("sp", "lr", "pc", "cpsr") + ("dfsr", "ifsr", "far") + ("fpexc", "fpinst", "fpinst2")
|
registerNames = tuple("r{0}".format(i) for i in range(13)) + ("sp", "lr", "pc", "cpsr") + ("dfsr", "ifsr", "far") + ("fpexc", "fpinst", "fpinst2")
|
||||||
svcBreakReasons = ("(svcBreak: panic)", "(svcBreak: assertion failed)", "(svcBreak: user-related)")
|
svcBreakReasons = ("(svcBreak: panic)", "(svcBreak: assertion failed)", "(svcBreak: user-related)")
|
||||||
|
faultStatusSources = {
|
||||||
|
0b1:'Alignment', 0b100:'Instruction cache maintenance operation fault',
|
||||||
|
0b1100:'External Abort on translation - First-level', 0b1110:'External Abort on translation - Second-level',
|
||||||
|
0b101:'Translation - Section', 0b111:'Translation - Page', 0b11:'Access bit - Section', 0b110:'Access bit - Page',
|
||||||
|
0b1001:'Domain - Section', 0b1011:'Domain - Page', 0b1101:'Permission - Section', 0b1111:'Permission - Page',
|
||||||
|
0b1000:'Precise External Abort', 0b10110:'Imprecise External Abort', 0b10:'Debug event'
|
||||||
|
}
|
||||||
|
|
||||||
if __name__ == "__main__":
|
def main(args=None):
|
||||||
parser = argparse.ArgumentParser(description="Parse Luma3DS exception dumps")
|
parser = argparse.ArgumentParser(description="Parse Luma3DS exception dumps")
|
||||||
parser.add_argument("filename")
|
parser.add_argument("filename")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
@@ -134,6 +141,11 @@ if __name__ == "__main__":
|
|||||||
typeDetailsStr = " (VFP exception)"
|
typeDetailsStr = " (VFP exception)"
|
||||||
|
|
||||||
print("Exception type: {0}{1}".format("unknown" if exceptionType >= len(handledExceptionNames) else handledExceptionNames[exceptionType], typeDetailsStr))
|
print("Exception type: {0}{1}".format("unknown" if exceptionType >= len(handledExceptionNames) else handledExceptionNames[exceptionType], typeDetailsStr))
|
||||||
|
|
||||||
|
if processor == 11 and exceptionType >= 2:
|
||||||
|
xfsr = registers[18] if exceptionType == 2 else registers[17]
|
||||||
|
print("Fault status: " + faultStatusSources[xfsr & 0xf])
|
||||||
|
|
||||||
if additionalDataSize != 0:
|
if additionalDataSize != 0:
|
||||||
print("Current process: {0} ({1:016x})".format(additionalData[:8].decode("ascii"), unpack_from("<Q", additionalData, 8)[0]))
|
print("Current process: {0} ({1:016x})".format(additionalData[:8].decode("ascii"), unpack_from("<Q", additionalData, 8)[0]))
|
||||||
|
|
||||||
@@ -143,6 +155,9 @@ if __name__ == "__main__":
|
|||||||
print(makeRegisterLine(registerNames[i], registers[i], registerNames[i+1], registers[i+1]))
|
print(makeRegisterLine(registerNames[i], registers[i], registerNames[i+1], registers[i+1]))
|
||||||
if nbRegisters % 2 == 1: print("{0:<15}{1:<20}".format(registerNames[nbRegisters - 1], "{0:08x}".format(registers[nbRegisters - 1])))
|
if nbRegisters % 2 == 1: print("{0:<15}{1:<20}".format(registerNames[nbRegisters - 1], "{0:08x}".format(registers[nbRegisters - 1])))
|
||||||
|
|
||||||
|
if processor == 11 and exceptionType == 3:
|
||||||
|
print("{0:<15}{1:<20}Access type: {2}".format("FAR", "{0:08x}".format(registers[19]), "Write" if registers[17] & (1 << 11) != 0 else "Read"))
|
||||||
|
|
||||||
thumb = registers[16] & 0x20 != 0
|
thumb = registers[16] & 0x20 != 0
|
||||||
addr = registers[15] - codeDumpSize + (2 if thumb else 4)
|
addr = registers[15] - codeDumpSize + (2 if thumb else 4)
|
||||||
|
|
||||||
@@ -151,8 +166,9 @@ if __name__ == "__main__":
|
|||||||
objdump_res = ""
|
objdump_res = ""
|
||||||
try:
|
try:
|
||||||
path = os.path.join(os.environ["DEVKITARM"], "bin", "arm-none-eabi-objdump")
|
path = os.path.join(os.environ["DEVKITARM"], "bin", "arm-none-eabi-objdump")
|
||||||
if os.name == "nt":
|
|
||||||
path = ''.join((path[1], ':', path[2:])).replace('/', '\\')
|
if os.name == "nt" and path[0] == '/':
|
||||||
|
path = ''.join((path[1], ':', path[2:]))
|
||||||
|
|
||||||
objdump_res = subprocess.check_output((
|
objdump_res = subprocess.check_output((
|
||||||
path, "-marm", "-b", "binary",
|
path, "-marm", "-b", "binary",
|
||||||
@@ -167,3 +183,6 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
print("\nStack dump:\n")
|
print("\nStack dump:\n")
|
||||||
print(hexdump(registers[13], stackDump))
|
print(hexdump(registers[13], stackDump))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
13
exceptions/exception_dump_parser/setup.py
Normal file
13
exceptions/exception_dump_parser/setup.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
from setuptools import setup, find_packages
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='luma3ds_exception_dump_parser',
|
||||||
|
version='1.2',
|
||||||
|
url='https://github.com/AuroraWright/Luma3DS',
|
||||||
|
author='TuxSH',
|
||||||
|
license='GPLv3',
|
||||||
|
description='Parses Luma3DS exception dumps',
|
||||||
|
install_requires=[''],
|
||||||
|
packages=find_packages(),
|
||||||
|
entry_points={'console_scripts': ['luma3ds_exception_dump_parser=luma3ds_exception_dump_parser.__main__:main']},
|
||||||
|
)
|
||||||
@@ -12,12 +12,14 @@
|
|||||||
#define BOOTCFG_NAND BOOTCONFIG(0, 7)
|
#define BOOTCFG_NAND BOOTCONFIG(0, 7)
|
||||||
#define BOOTCFG_FIRM BOOTCONFIG(3, 7)
|
#define BOOTCFG_FIRM BOOTCONFIG(3, 7)
|
||||||
#define BOOTCFG_NOFORCEFLAG BOOTCONFIG(6, 1)
|
#define BOOTCFG_NOFORCEFLAG BOOTCONFIG(6, 1)
|
||||||
|
#define BOOTCFG_NTRCARDBOOT BOOTCONFIG(7, 1)
|
||||||
|
|
||||||
enum multiOptions
|
enum multiOptions
|
||||||
{
|
{
|
||||||
DEFAULTEMU = 0,
|
DEFAULTEMU = 0,
|
||||||
BRIGHTNESS,
|
BRIGHTNESS,
|
||||||
SPLASH,
|
SPLASH,
|
||||||
|
SPLASH_DURATION,
|
||||||
PIN,
|
PIN,
|
||||||
NEWCPU
|
NEWCPU
|
||||||
};
|
};
|
||||||
@@ -30,7 +32,6 @@ enum singleOptions
|
|||||||
PATCHGAMES,
|
PATCHGAMES,
|
||||||
PATCHVERSTRING,
|
PATCHVERSTRING,
|
||||||
SHOWGBABOOT,
|
SHOWGBABOOT,
|
||||||
PATCHACCESS,
|
|
||||||
PATCHUNITINFO,
|
PATCHUNITINFO,
|
||||||
DISABLEARM11EXCHANDLERS
|
DISABLEARM11EXCHANDLERS
|
||||||
};
|
};
|
||||||
|
|||||||
39
k11_extension/include/debug.h
Normal file
39
k11_extension/include/debug.h
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that 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/>.
|
||||||
|
*
|
||||||
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
|
* author attributions in that material or in the Appropriate Legal
|
||||||
|
* Notices displayed by works containing it.
|
||||||
|
* * Prohibiting misrepresentation of the origin of that material,
|
||||||
|
* or requiring that modified versions of such material be marked in
|
||||||
|
* reasonable ways as different from the original version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
#include "globals.h"
|
||||||
|
#include "kernel.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
extern KRecursiveLock dbgParamsLock;
|
||||||
|
extern u32 dbgParamWatchpointId, dbgParamDVA, dbgParamWCR, dbgParamContextId;
|
||||||
|
|
||||||
|
KSchedulableInterruptEvent *enableMonitorModeDebugging(KBaseInterruptEvent *this, u32 interruptID);
|
||||||
|
KSchedulableInterruptEvent *disableWatchpoint(KBaseInterruptEvent *this, u32 interruptID);
|
||||||
|
KSchedulableInterruptEvent *setWatchpointWithContextId(KBaseInterruptEvent *this, u32 interruptID);
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -56,6 +56,7 @@ extern void (*KScheduler__AttemptSwitchingThreadContext)(KScheduler *this);
|
|||||||
extern Result (*ControlMemory)(u32 *addrOut, u32 addr0, u32 addr1, u32 size, MemOp op, MemPerm perm, bool isLoader);
|
extern Result (*ControlMemory)(u32 *addrOut, u32 addr0, u32 addr1, u32 size, MemOp op, MemPerm perm, bool isLoader);
|
||||||
extern void (*SleepThread)(s64 ns);
|
extern void (*SleepThread)(s64 ns);
|
||||||
extern Result (*CloseHandle)(Handle handle);
|
extern Result (*CloseHandle)(Handle handle);
|
||||||
|
extern Result (*GetHandleInfo)(s64 *out, Handle handle, u32 type);
|
||||||
extern Result (*GetSystemInfo)(s64 *out, s32 type, s32 param);
|
extern Result (*GetSystemInfo)(s64 *out, s32 type, s32 param);
|
||||||
extern Result (*GetProcessInfo)(s64 *out, Handle processHandle, u32 type);
|
extern Result (*GetProcessInfo)(s64 *out, Handle processHandle, u32 type);
|
||||||
extern Result (*GetThreadInfo)(s64 *out, Handle threadHandle, u32 type);
|
extern Result (*GetThreadInfo)(s64 *out, Handle threadHandle, u32 type);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -1137,21 +1137,29 @@ typedef struct FcramLayout
|
|||||||
extern bool isN3DS;
|
extern bool isN3DS;
|
||||||
extern void *officialSVCs[0x7E];
|
extern void *officialSVCs[0x7E];
|
||||||
|
|
||||||
#define KPROCESS_OFFSETOF(field) (isN3DS ? offsetof(KProcessN3DS, field) :\
|
#define KPROCESSRELATED_OFFSETOFF(classname, field) (isN3DS ? offsetof(classname##N3DS, field) :\
|
||||||
((kernelVersion >= SYSTEM_VERSION(2, 44, 6)) ? offsetof(KProcessO3DS8x, field) :\
|
((kernelVersion >= SYSTEM_VERSION(2, 44, 6)) ? offsetof(classname##O3DS8x, field) :\
|
||||||
offsetof(KProcessO3DSPre8x, field)))
|
offsetof(classname##O3DSPre8x, field)))
|
||||||
|
|
||||||
#define KPROCESS_GET_PTR(obj, field) (isN3DS ? &(obj)->N3DS.field :\
|
#define KPROCESSRELATED_GET_PTR(obj, field) (isN3DS ? &(obj)->N3DS.field :\
|
||||||
((kernelVersion >= SYSTEM_VERSION(2, 44, 6)) ? &(obj)->O3DS8x.field :\
|
((kernelVersion >= SYSTEM_VERSION(2, 44, 6)) ? &(obj)->O3DS8x.field :\
|
||||||
&(obj)->O3DSPre8x.field))
|
&(obj)->O3DSPre8x.field))
|
||||||
|
|
||||||
#define KPROCESS_GET_PTR_TYPE(type, obj, field) (isN3DS ? (type *)(&(obj)->N3DS.field) :\
|
#define KPROCESSRELATED_GET_PTR_TYPE(type, obj, field) (isN3DS ? (type *)(&(obj)->N3DS.field) :\
|
||||||
((kernelVersion >= SYSTEM_VERSION(2, 44, 6)) ? (type *)(&(obj)->O3DS8x.field) :\
|
((kernelVersion >= SYSTEM_VERSION(2, 44, 6)) ? (type *)(&(obj)->O3DS8x.field) :\
|
||||||
(type *)(&(obj)->O3DSPre8x.field)))
|
(type *)(&(obj)->O3DSPre8x.field)))
|
||||||
|
|
||||||
|
#define KPROCESS_OFFSETOF(field) KPROCESSRELATED_OFFSETOFF(KProcess, field)
|
||||||
|
#define KPROCESS_GET_PTR(obj, field) KPROCESSRELATED_GET_PTR(obj, field)
|
||||||
|
#define KPROCESS_GET_PTR_TYPE(type, obj, field) KPROCESSRELATED_GET_PTR_TYPE(type, obj, field)
|
||||||
#define KPROCESS_GET_RVALUE(obj, field) *(KPROCESS_GET_PTR(obj, field))
|
#define KPROCESS_GET_RVALUE(obj, field) *(KPROCESS_GET_PTR(obj, field))
|
||||||
|
#define KPROCESS_GET_RVALUE_TYPE(type, obj, field) *(KPROCESS_GET_PTR_TYPE(type, obj, field))
|
||||||
|
|
||||||
#define KPROCESS_GET_RVALUE_TYPE(type, obj, field) *(KPROCESS_GET_PTR(type, obj, field))
|
#define KPROCESSHWINFO_OFFSETOF(field) KPROCESSRELATED_OFFSETOFF(KProcessHwInfo, field)
|
||||||
|
#define KPROCESSHWINFO_GET_PTR(obj, field) KPROCESSRELATED_GET_PTR(obj, field)
|
||||||
|
#define KPROCESSHWINFO_GET_PTR_TYPE(type, obj, field) KPROCESSRELATED_GET_PTR_TYPE(type, obj, field)
|
||||||
|
#define KPROCESSHWINFO_GET_RVALUE(obj, field) *(KPROCESSHWINFO_GET_PTR(obj, field))
|
||||||
|
#define KPROCESSHWINFO_GET_RVALUE_TYPE(type, obj, field) *(KPROCESSHWINFO_GET_PTR_TYPE(type, obj, field))
|
||||||
|
|
||||||
static inline u32 idOfProcess(KProcess *process)
|
static inline u32 idOfProcess(KProcess *process)
|
||||||
{
|
{
|
||||||
@@ -1178,6 +1186,20 @@ static inline KDebug *debugOfProcess(KProcess *process)
|
|||||||
return KPROCESS_GET_RVALUE(process, debug);
|
return KPROCESS_GET_RVALUE(process, debug);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline const char *classNameOfAutoObject(KAutoObject *object)
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
if(kernelVersion >= SYSTEM_VERSION(2, 46, 0))
|
||||||
|
{
|
||||||
|
KClassToken tok;
|
||||||
|
object->vtable->GetClassToken(&tok, object);
|
||||||
|
name = tok.name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
name = object->vtable->GetClassName(object);
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
extern Result (*KProcessHandleTable__CreateHandle)(KProcessHandleTable *this, Handle *out, KAutoObject *obj, u8 token);
|
extern Result (*KProcessHandleTable__CreateHandle)(KProcessHandleTable *this, Handle *out, KAutoObject *obj, u8 token);
|
||||||
|
|
||||||
static inline Result createHandleForProcess(Handle *out, KProcess *process, KAutoObject *obj)
|
static inline Result createHandleForProcess(Handle *out, KProcess *process, KAutoObject *obj)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
34
k11_extension/include/svc/GetHandleInfo.h
Normal file
34
k11_extension/include/svc/GetHandleInfo.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that 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/>.
|
||||||
|
*
|
||||||
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
|
* author attributions in that material or in the Appropriate Legal
|
||||||
|
* Notices displayed by works containing it.
|
||||||
|
* * Prohibiting misrepresentation of the origin of that material,
|
||||||
|
* or requiring that modified versions of such material be marked in
|
||||||
|
* reasonable ways as different from the original version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "utils.h"
|
||||||
|
#include "kernel.h"
|
||||||
|
#include "svc.h"
|
||||||
|
|
||||||
|
Result GetHandleInfoHookWrapper(u32 dummy, Handle handle, u32 type);
|
||||||
|
Result GetHandleInfoHook(s64 *out, Handle handle, u32 type);
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -30,4 +30,4 @@
|
|||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "svc.h"
|
#include "svc.h"
|
||||||
|
|
||||||
void SetWifiEnabled(bool enable);
|
Result SetWifiEnabled(bool enable);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
147
k11_extension/source/debug.c
Normal file
147
k11_extension/source/debug.c
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that 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/>.
|
||||||
|
*
|
||||||
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
|
* author attributions in that material or in the Appropriate Legal
|
||||||
|
* Notices displayed by works containing it.
|
||||||
|
* * Prohibiting misrepresentation of the origin of that material,
|
||||||
|
* or requiring that modified versions of such material be marked in
|
||||||
|
* reasonable ways as different from the original version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "debug.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "synchronization.h"
|
||||||
|
|
||||||
|
KRecursiveLock dbgParamsLock = { NULL };
|
||||||
|
u32 dbgParamWatchpointId, dbgParamDVA, dbgParamWCR, dbgParamContextId;
|
||||||
|
|
||||||
|
KSchedulableInterruptEvent *enableMonitorModeDebugging(KBaseInterruptEvent *this UNUSED, u32 interruptID UNUSED)
|
||||||
|
{
|
||||||
|
coreBarrier();
|
||||||
|
|
||||||
|
u32 DSCR;
|
||||||
|
__asm__ __volatile__("mrc p14, 0, %[val], c0, c1, 0" : [val] "=r" (DSCR));
|
||||||
|
DSCR |= 0x8000;
|
||||||
|
__asm__ __volatile__("mcr p14, 0, %[val], c0, c1, 0" :: [val] "r" (DSCR));
|
||||||
|
|
||||||
|
__dsb();
|
||||||
|
coreBarrier();
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void disableWatchpoint0(void)
|
||||||
|
{
|
||||||
|
u32 control;
|
||||||
|
|
||||||
|
// WCR0
|
||||||
|
__asm__ __volatile__("mrc p14, 0, %[val], c0, c0, 7" : [val] "=r" (control));
|
||||||
|
control &= ~1;
|
||||||
|
__asm__ __volatile__("mcr p14, 0, %[val], c0, c0, 7" :: [val] "r" (control));
|
||||||
|
|
||||||
|
// BCR4
|
||||||
|
__asm__ __volatile__("mrc p14, 0, %[val], c0, c4, 5" : [val] "=r" (control));
|
||||||
|
control &= ~1;
|
||||||
|
__asm__ __volatile__("mcr p14, 0, %[val], c0, c4, 5" :: [val] "r" (control));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void disableWatchpoint1(void)
|
||||||
|
{
|
||||||
|
u32 control;
|
||||||
|
|
||||||
|
// WCR1
|
||||||
|
__asm__ __volatile__("mrc p14, 0, %[val], c0, c1, 7" : [val] "=r" (control));
|
||||||
|
control &= ~1;
|
||||||
|
__asm__ __volatile__("mcr p14, 0, %[val], c0, c1, 7" :: [val] "r" (control));
|
||||||
|
|
||||||
|
// BCR5
|
||||||
|
__asm__ __volatile__("mrc p14, 0, %[val], c0, c5, 5" : [val] "=r" (control));
|
||||||
|
control &= ~1;
|
||||||
|
__asm__ __volatile__("mcr p14, 0, %[val], c0, c5, 5" :: [val] "r" (control));
|
||||||
|
}
|
||||||
|
|
||||||
|
KSchedulableInterruptEvent *disableWatchpoint(KBaseInterruptEvent *this UNUSED, u32 interruptID UNUSED)
|
||||||
|
{
|
||||||
|
coreBarrier();
|
||||||
|
|
||||||
|
if(dbgParamWatchpointId == 0)
|
||||||
|
disableWatchpoint0();
|
||||||
|
else
|
||||||
|
disableWatchpoint1();
|
||||||
|
|
||||||
|
__dsb();
|
||||||
|
coreBarrier();
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setWatchpoint0WithContextId(u32 DVA, u32 WCR, u32 contextId)
|
||||||
|
{
|
||||||
|
// http://infocenter.arm.com/help/topic/com.arm.doc.ddi0360f/CEGCFFDF.html
|
||||||
|
u32 BCR =
|
||||||
|
(1 << 21) | /* compare with context ID */
|
||||||
|
(1 << 20) | /* linked (with a WRP in our case) */
|
||||||
|
(0xf << 5) | /* byte address select, +0 to +3 as mandated when linking with a WRP */
|
||||||
|
(3 << 1) | /* either privileged modes or user mode, as mandated when linking with a WRP */
|
||||||
|
(1 << 0) ; /* enabled */
|
||||||
|
|
||||||
|
disableWatchpoint0();
|
||||||
|
|
||||||
|
__asm__ __volatile__("mcr p14, 0, %[val], c0, c0, 6" :: [val] "r" (DVA));
|
||||||
|
__asm__ __volatile__("mcr p14, 0, %[val], c0, c4, 4" :: [val] "r" (contextId));
|
||||||
|
__asm__ __volatile__("mcr p14, 0, %[val], c0, c0, 7" :: [val] "r" (WCR));
|
||||||
|
__asm__ __volatile__("mcr p14, 0, %[val], c0, c4, 5" :: [val] "r" (BCR));
|
||||||
|
|
||||||
|
__asm__ __volatile__("mcr p15, 0, %[val], c7, c10, 5" :: [val] "r" (0) : "memory"); // DMB
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setWatchpoint1WithContextId(u32 DVA, u32 WCR, u32 contextId)
|
||||||
|
{
|
||||||
|
// http://infocenter.arm.com/help/topic/com.arm.doc.ddi0360f/CEGCFFDF.html
|
||||||
|
u32 BCR =
|
||||||
|
(1 << 21) | /* compare with context ID */
|
||||||
|
(1 << 20) | /* linked (with a WRP in our case) */
|
||||||
|
(0xf << 5) | /* byte address select, +0 to +3 as mandated when linking with a WRP */
|
||||||
|
(3 << 1) | /* either privileged modes or user mode, as mandated when linking with a WRP */
|
||||||
|
(1 << 0) ; /* enabled */
|
||||||
|
|
||||||
|
disableWatchpoint1();
|
||||||
|
|
||||||
|
__asm__ __volatile__("mcr p14, 0, %[val], c0, c1, 6" :: [val] "r" (DVA));
|
||||||
|
__asm__ __volatile__("mcr p14, 0, %[val], c0, c5, 4" :: [val] "r" (contextId));
|
||||||
|
__asm__ __volatile__("mcr p14, 0, %[val], c0, c1, 7" :: [val] "r" (WCR));
|
||||||
|
__asm__ __volatile__("mcr p14, 0, %[val], c0, c5, 5" :: [val] "r" (BCR));
|
||||||
|
|
||||||
|
__asm__ __volatile__("mcr p15, 0, %[val], c7, c10, 5" :: [val] "r" (0) : "memory"); // DMB
|
||||||
|
}
|
||||||
|
|
||||||
|
KSchedulableInterruptEvent *setWatchpointWithContextId(KBaseInterruptEvent *this UNUSED, u32 interruptID UNUSED)
|
||||||
|
{
|
||||||
|
coreBarrier();
|
||||||
|
|
||||||
|
if(dbgParamWatchpointId == 0)
|
||||||
|
setWatchpoint0WithContextId(dbgParamDVA, dbgParamWCR, dbgParamContextId);
|
||||||
|
else
|
||||||
|
setWatchpoint1WithContextId(dbgParamDVA, dbgParamWCR, dbgParamContextId);
|
||||||
|
|
||||||
|
__dsb();
|
||||||
|
coreBarrier();
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
@
|
@
|
||||||
@ This program is free software: you can redistribute it and/or modify
|
@ This program is free software: you can redistribute it and/or modify
|
||||||
@ it under the terms of the GNU General Public License as published by
|
@ it under the terms of the GNU General Public License as published by
|
||||||
@@ -159,7 +159,7 @@ _commonHandler:
|
|||||||
|
|
||||||
_no_L2C:
|
_no_L2C:
|
||||||
|
|
||||||
cps #0x1F
|
msr cpsr_cxsf, #0xdf @ finally, switch to system mode, mask interrupts and clear flags (in case of double faults)
|
||||||
ldr sp, =exceptionStackTop
|
ldr sp, =exceptionStackTop
|
||||||
ldr sp, [sp]
|
ldr sp, [sp]
|
||||||
sub sp, #0x100
|
sub sp, #0x100
|
||||||
@@ -221,7 +221,8 @@ prefetchAbortHandler:
|
|||||||
pop {r8-r11}
|
pop {r8-r11}
|
||||||
ldr lr, [sp, #8]!
|
ldr lr, [sp, #8]!
|
||||||
ldr sp, [sp, #4]
|
ldr sp, [sp, #4]
|
||||||
msr spsr, sp
|
msr spsr_cxsf, sp
|
||||||
|
tst sp, #0x20
|
||||||
addne lr, #2 @ adjust address for later
|
addne lr, #2 @ adjust address for later
|
||||||
|
|
||||||
GEN_USUAL_HANDLER _prefetchAbortNormal, 2, 12
|
GEN_USUAL_HANDLER _prefetchAbortNormal, 2, 12
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -37,7 +37,7 @@ bool isExceptionFatal(u32 spsr, u32 *regs, u32 index)
|
|||||||
{
|
{
|
||||||
if(CONFIG(DISABLEARM11EXCHANDLERS)) return false;
|
if(CONFIG(DISABLEARM11EXCHANDLERS)) return false;
|
||||||
|
|
||||||
if((spsr & 0x1f) != 0x10) return true;
|
if((spsr & 0x1F) != 0x10) return true;
|
||||||
|
|
||||||
KThread *thread = currentCoreContext->objectContext.currentThread;
|
KThread *thread = currentCoreContext->objectContext.currentThread;
|
||||||
KProcess *currentProcess = currentCoreContext->objectContext.currentProcess;
|
KProcess *currentProcess = currentCoreContext->objectContext.currentProcess;
|
||||||
@@ -65,7 +65,7 @@ bool isExceptionFatal(u32 spsr, u32 *regs, u32 index)
|
|||||||
extern u32 safecpy_sz;
|
extern u32 safecpy_sz;
|
||||||
bool isDataAbortExceptionRangeControlled(u32 spsr, u32 addr)
|
bool isDataAbortExceptionRangeControlled(u32 spsr, u32 addr)
|
||||||
{
|
{
|
||||||
return ((spsr & 0x1F) != 0x10) && (
|
return (!(spsr & 0x20) && (spsr & 0x1F) != 0x10) && (
|
||||||
((u32)kernelUsrCopyFuncsStart <= addr && addr < (u32)kernelUsrCopyFuncsEnd) ||
|
((u32)kernelUsrCopyFuncsStart <= addr && addr < (u32)kernelUsrCopyFuncsEnd) ||
|
||||||
((u32)safecpy <= addr && addr < (u32)safecpy + safecpy_sz)
|
((u32)safecpy <= addr && addr < (u32)safecpy + safecpy_sz)
|
||||||
);
|
);
|
||||||
@@ -96,7 +96,7 @@ void fatalExceptionHandlersMain(u32 *registerDump, u32 type, u32 cpuId)
|
|||||||
registerDump[15] = pc;
|
registerDump[15] = pc;
|
||||||
|
|
||||||
//Dump code
|
//Dump code
|
||||||
u8 *instr = (u8 *)pc + ((cpsr & 0x20) ? 2 : 4) - dumpHeader.codeDumpSize; //Doesn't work well on 32-bit Thumb instructions, but it isn't much of a problem
|
u8 *instr = (u8 *)pc + ((cpsr & 0x20) ? 2 : 4) - dumpHeader.codeDumpSize; //wouldn't work well on 32-bit Thumb instructions, but it isn't much of a problem
|
||||||
dumpHeader.codeDumpSize = ((u32)instr & (((cpsr & 0x20) != 0) ? 1 : 3)) != 0 ? 0 : safecpy(codeDump, instr, dumpHeader.codeDumpSize);
|
dumpHeader.codeDumpSize = ((u32)instr & (((cpsr & 0x20) != 0) ? 1 : 3)) != 0 ? 0 : safecpy(codeDump, instr, dumpHeader.codeDumpSize);
|
||||||
|
|
||||||
//Copy register dump and code dump
|
//Copy register dump and code dump
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -52,6 +52,7 @@ void (*KScheduler__AttemptSwitchingThreadContext)(KScheduler *this);
|
|||||||
Result (*ControlMemory)(u32 *addrOut, u32 addr0, u32 addr1, u32 size, MemOp op, MemPerm perm, bool isLoader);
|
Result (*ControlMemory)(u32 *addrOut, u32 addr0, u32 addr1, u32 size, MemOp op, MemPerm perm, bool isLoader);
|
||||||
void (*SleepThread)(s64 ns);
|
void (*SleepThread)(s64 ns);
|
||||||
Result (*CloseHandle)(Handle handle);
|
Result (*CloseHandle)(Handle handle);
|
||||||
|
Result (*GetHandleInfo)(s64 *out, Handle handle, u32 type);
|
||||||
Result (*GetSystemInfo)(s64 *out, s32 type, s32 param);
|
Result (*GetSystemInfo)(s64 *out, s32 type, s32 param);
|
||||||
Result (*GetProcessInfo)(s64 *out, Handle processHandle, u32 type);
|
Result (*GetProcessInfo)(s64 *out, Handle processHandle, u32 type);
|
||||||
Result (*GetThreadInfo)(s64 *out, Handle threadHandle, u32 type);
|
Result (*GetThreadInfo)(s64 *out, Handle threadHandle, u32 type);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -147,7 +147,8 @@ static void findUsefulSymbols(void)
|
|||||||
for(off = (u32 *)decodeARMBranch(3 + (u32 *)officialSVCs[0x34]) /* OpenThread */; *off != 0xD9001BF7; off++);
|
for(off = (u32 *)decodeARMBranch(3 + (u32 *)officialSVCs[0x34]) /* OpenThread */; *off != 0xD9001BF7; off++);
|
||||||
threadList = *(KObjectList **)(off + 1);
|
threadList = *(KObjectList **)(off + 1);
|
||||||
|
|
||||||
KProcessHandleTable__ToKThread = (KThread * (*)(KProcessHandleTable *, Handle))decodeARMBranch((u32 *)decodeARMBranch((u32 *)officialSVCs[0x37] + 3) /* GetThreadId */ + 5);
|
off = (u32 *)decodeARMBranch((u32 *)officialSVCs[0x37] + 3) + 5; /* GetThreadId */
|
||||||
|
KProcessHandleTable__ToKThread = (KThread * (*)(KProcessHandleTable *, Handle))decodeARMBranch((*off >> 16) == 0xEB00 ? off : off + 2);
|
||||||
|
|
||||||
for(off = (u32 *)officialSVCs[0x50]; off[0] != 0xE1A05000 || off[1] != 0xE2100102 || off[2] != 0x5A00000B; off++);
|
for(off = (u32 *)officialSVCs[0x50]; off[0] != 0xE1A05000 || off[1] != 0xE2100102 || off[2] != 0x5A00000B; off++);
|
||||||
InterruptManager__MapInterrupt = (Result (*)(InterruptManager *, KBaseInterruptEvent *, u32, u32, u32, bool, bool))decodeARMBranch(--off);
|
InterruptManager__MapInterrupt = (Result (*)(InterruptManager *, KBaseInterruptEvent *, u32, u32, u32, bool, bool))decodeARMBranch(--off);
|
||||||
@@ -208,6 +209,7 @@ static void findUsefulSymbols(void)
|
|||||||
decodeARMBranch((u32 *)officialSVCs[0x01] + 5);
|
decodeARMBranch((u32 *)officialSVCs[0x01] + 5);
|
||||||
SleepThread = (void (*)(s64))officialSVCs[0x0A];
|
SleepThread = (void (*)(s64))officialSVCs[0x0A];
|
||||||
CloseHandle = (Result (*)(Handle))officialSVCs[0x23];
|
CloseHandle = (Result (*)(Handle))officialSVCs[0x23];
|
||||||
|
GetHandleInfo = (Result (*)(s64 *, Handle, u32))decodeARMBranch((u32 *)officialSVCs[0x29] + 3);
|
||||||
GetSystemInfo = (Result (*)(s64 *, s32, s32))decodeARMBranch((u32 *)officialSVCs[0x2A] + 3);
|
GetSystemInfo = (Result (*)(s64 *, s32, s32))decodeARMBranch((u32 *)officialSVCs[0x2A] + 3);
|
||||||
GetProcessInfo = (Result (*)(s64 *, Handle, u32))decodeARMBranch((u32 *)officialSVCs[0x2B] + 3);
|
GetProcessInfo = (Result (*)(s64 *, Handle, u32))decodeARMBranch((u32 *)officialSVCs[0x2B] + 3);
|
||||||
GetThreadInfo = (Result (*)(s64 *, Handle, u32))decodeARMBranch((u32 *)officialSVCs[0x2C] + 3);
|
GetThreadInfo = (Result (*)(s64 *, Handle, u32))decodeARMBranch((u32 *)officialSVCs[0x2C] + 3);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
@
|
@
|
||||||
@ This program is free software: you can redistribute it and/or modify
|
@ This program is free software: you can redistribute it and/or modify
|
||||||
@ it under the terms of the GNU General Public License as published by
|
@ it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -28,9 +28,10 @@
|
|||||||
#include "synchronization.h"
|
#include "synchronization.h"
|
||||||
#include "svc.h"
|
#include "svc.h"
|
||||||
#include "svc/ControlMemory.h"
|
#include "svc/ControlMemory.h"
|
||||||
|
#include "svc/GetHandleInfo.h"
|
||||||
|
#include "svc/GetSystemInfo.h"
|
||||||
#include "svc/GetProcessInfo.h"
|
#include "svc/GetProcessInfo.h"
|
||||||
#include "svc/GetThreadInfo.h"
|
#include "svc/GetThreadInfo.h"
|
||||||
#include "svc/GetSystemInfo.h"
|
|
||||||
#include "svc/GetCFWInfo.h"
|
#include "svc/GetCFWInfo.h"
|
||||||
#include "svc/ConnectToPort.h"
|
#include "svc/ConnectToPort.h"
|
||||||
#include "svc/SendSyncRequest.h"
|
#include "svc/SendSyncRequest.h"
|
||||||
@@ -103,6 +104,8 @@ void *svcHook(u8 *pageEnd)
|
|||||||
doingVeryShittyPmResLimitWorkaround = true;
|
doingVeryShittyPmResLimitWorkaround = true;
|
||||||
}
|
}
|
||||||
return officialSVCs[0x17];
|
return officialSVCs[0x17];
|
||||||
|
case 0x29:
|
||||||
|
return GetHandleInfoHookWrapper;
|
||||||
case 0x2A:
|
case 0x2A:
|
||||||
return GetSystemInfoHookWrapper;
|
return GetSystemInfoHookWrapper;
|
||||||
case 0x2B:
|
case 0x2B:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
@
|
@
|
||||||
@ This program is free software: you can redistribute it and/or modify
|
@ This program is free software: you can redistribute it and/or modify
|
||||||
@ it under the terms of the GNU General Public License as published by
|
@ it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
@
|
@
|
||||||
@ This program is free software: you can redistribute it and/or modify
|
@ This program is free software: you can redistribute it and/or modify
|
||||||
@ it under the terms of the GNU General Public License as published by
|
@ it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -42,20 +42,12 @@ Result ControlService(ServiceOp op, u32 varg1, u32 varg2)
|
|||||||
KAutoObject *obj = KProcessHandleTable__ToKAutoObject(handleTable, (Handle)varg2);
|
KAutoObject *obj = KProcessHandleTable__ToKAutoObject(handleTable, (Handle)varg2);
|
||||||
if(obj == NULL)
|
if(obj == NULL)
|
||||||
return 0xD8E007F7; // invalid handle
|
return 0xD8E007F7; // invalid handle
|
||||||
else if(kernelVersion >= SYSTEM_VERSION(2, 46, 0))
|
|
||||||
{
|
|
||||||
KClassToken tok;
|
|
||||||
obj->vtable->GetClassToken(&tok, obj);
|
|
||||||
if(tok.flags == 0x95)
|
|
||||||
session = ((KServerSession *)obj)->parentSession;
|
|
||||||
else if(tok.flags == 0xA5)
|
|
||||||
session = ((KClientSession *)obj)->parentSession;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{ // not the exact same tests but it should work
|
{
|
||||||
if(strcmp(obj->vtable->GetClassName(obj), "KServerSession") == 0)
|
// not the exact same tests but it should work
|
||||||
|
if(strcmp(classNameOfAutoObject(obj), "KServerSession") == 0)
|
||||||
session = ((KServerSession *)obj)->parentSession;
|
session = ((KServerSession *)obj)->parentSession;
|
||||||
else if(strcmp(obj->vtable->GetClassName(obj), "KClientSession") == 0)
|
else if(strcmp(classNameOfAutoObject(obj), "KClientSession") == 0)
|
||||||
session = ((KClientSession *)obj)->parentSession;
|
session = ((KClientSession *)obj)->parentSession;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
@
|
@
|
||||||
@ This program is free software: you can redistribute it and/or modify
|
@ This program is free software: you can redistribute it and/or modify
|
||||||
@ it under the terms of the GNU General Public License as published by
|
@ it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
62
k11_extension/source/svc/GetHandleInfo.c
Normal file
62
k11_extension/source/svc/GetHandleInfo.c
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that 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/>.
|
||||||
|
*
|
||||||
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
|
* author attributions in that material or in the Appropriate Legal
|
||||||
|
* Notices displayed by works containing it.
|
||||||
|
* * Prohibiting misrepresentation of the origin of that material,
|
||||||
|
* or requiring that modified versions of such material be marked in
|
||||||
|
* reasonable ways as different from the original version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "svc/GetThreadInfo.h"
|
||||||
|
#include "memory.h"
|
||||||
|
|
||||||
|
Result GetHandleInfoHook(s64 *out, Handle handle, u32 type)
|
||||||
|
{
|
||||||
|
if(type == 0x10000) // KDebug and KProcess: get context ID
|
||||||
|
{
|
||||||
|
KProcessHwInfo *hwInfo;
|
||||||
|
KProcessHandleTable *handleTable = handleTableOfProcess(currentCoreContext->objectContext.currentProcess);
|
||||||
|
KAutoObject *obj;
|
||||||
|
if(handle == CUR_PROCESS_HANDLE)
|
||||||
|
{
|
||||||
|
obj = (KAutoObject *)(currentCoreContext->objectContext.currentProcess);
|
||||||
|
KAutoObject__AddReference(obj);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
obj = KProcessHandleTable__ToKAutoObject(handleTable, handle);
|
||||||
|
|
||||||
|
if(obj == NULL)
|
||||||
|
return 0xD8E007F7;
|
||||||
|
|
||||||
|
if(strcmp(classNameOfAutoObject(obj), "KDebug") == 0)
|
||||||
|
hwInfo = hwInfoOfProcess(((KDebug *)obj)->owner);
|
||||||
|
else if(strcmp(classNameOfAutoObject(obj), "KProcess") == 0)
|
||||||
|
hwInfo = hwInfoOfProcess((KProcess *)obj);
|
||||||
|
else
|
||||||
|
hwInfo = NULL;
|
||||||
|
|
||||||
|
*out = hwInfo != NULL ? KPROCESSHWINFO_GET_RVALUE(hwInfo, contextId) : -1;
|
||||||
|
|
||||||
|
obj->vtable->DecrementReferenceCount(obj);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return GetHandleInfo(out, handle, type);
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -73,12 +73,12 @@ Result GetProcessInfoHook(s64 *out, Handle processHandle, u32 type)
|
|||||||
*out = (s64)(u64)(u32)codeSetOfProcess(process)->dataSection.section.loadAddress;
|
*out = (s64)(u64)(u32)codeSetOfProcess(process)->dataSection.section.loadAddress;
|
||||||
break;
|
break;
|
||||||
case 0x10008:
|
case 0x10008:
|
||||||
*out = (isN3DS ? hwInfoOfProcess(process)->N3DS.translationTableBase :
|
{
|
||||||
(kernelVersion >= SYSTEM_VERSION(2, 44, 6)
|
KProcessHwInfo *hwInfo = hwInfoOfProcess(process);
|
||||||
? hwInfoOfProcess(process)->O3DS8x.translationTableBase
|
u32 ttb = KPROCESSHWINFO_GET_RVALUE(hwInfo, translationTableBase);
|
||||||
: hwInfoOfProcess(process)->O3DSPre8x.translationTableBase)
|
*out = ttb & ~((1 << (14 - TTBCR)) - 1);
|
||||||
) & ~((1 << (14 - TTBCR)) - 1);
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
res = 0xD8E007ED; // invalid enum value
|
res = 0xD8E007ED; // invalid enum value
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -27,6 +27,7 @@
|
|||||||
#include "svc/KernelSetState.h"
|
#include "svc/KernelSetState.h"
|
||||||
#include "synchronization.h"
|
#include "synchronization.h"
|
||||||
#include "ipc.h"
|
#include "ipc.h"
|
||||||
|
#include "debug.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
|
|
||||||
#define MAX_DEBUG 3
|
#define MAX_DEBUG 3
|
||||||
@@ -142,7 +143,41 @@ Result KernelSetStateHook(u32 type, u32 varg1, u32 varg2, u32 varg3)
|
|||||||
res = SetSyscallDebugEventMask(varg1, (bool)varg2, (const u32 *)varg3);
|
res = SetSyscallDebugEventMask(varg1, (bool)varg2, (const u32 *)varg3);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 0x10003:
|
||||||
|
{
|
||||||
|
executeFunctionOnCores(enableMonitorModeDebugging, 0xF, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x10004:
|
||||||
|
{
|
||||||
|
KRecursiveLock__Lock(&dbgParamsLock);
|
||||||
|
dbgParamWatchpointId = varg1;
|
||||||
|
executeFunctionOnCores(disableWatchpoint, 0xF, 0);
|
||||||
|
KRecursiveLock__Unlock(&dbgParamsLock);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x10005:
|
||||||
|
{
|
||||||
|
KRecursiveLock__Lock(&dbgParamsLock);
|
||||||
|
dbgParamWatchpointId = 0;
|
||||||
|
dbgParamDVA = varg1;
|
||||||
|
dbgParamWCR = varg2;
|
||||||
|
dbgParamContextId = varg3;
|
||||||
|
executeFunctionOnCores(setWatchpointWithContextId, 0xF, 0);
|
||||||
|
KRecursiveLock__Unlock(&dbgParamsLock);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x10006:
|
||||||
|
{
|
||||||
|
KRecursiveLock__Lock(&dbgParamsLock);
|
||||||
|
dbgParamWatchpointId = 1;
|
||||||
|
dbgParamDVA = varg1;
|
||||||
|
dbgParamWCR = varg2;
|
||||||
|
dbgParamContextId = varg3;
|
||||||
|
executeFunctionOnCores(setWatchpointWithContextId, 0xF, 0);
|
||||||
|
KRecursiveLock__Unlock(&dbgParamsLock);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
res = KernelSetState(type, varg1, varg2, varg3);
|
res = KernelSetState(type, varg1, varg2, varg3);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -37,15 +37,8 @@ Result SendSyncRequestHook(Handle handle)
|
|||||||
bool skip = false;
|
bool skip = false;
|
||||||
Result res = 0;
|
Result res = 0;
|
||||||
|
|
||||||
bool isValidClientSession = false;
|
// not the exact same test but it should work
|
||||||
if(clientSession != NULL && kernelVersion >= SYSTEM_VERSION(2, 46, 0))
|
bool isValidClientSession = clientSession != NULL && strcmp(classNameOfAutoObject(&clientSession->syncObject.autoObject), "KClientSession") == 0;
|
||||||
{
|
|
||||||
KClassToken tok;
|
|
||||||
clientSession->syncObject.autoObject.vtable->GetClassToken(&tok, &clientSession->syncObject.autoObject);
|
|
||||||
isValidClientSession = tok.flags == 0xA5;
|
|
||||||
}
|
|
||||||
else if(clientSession != NULL) // not the exact same test but it should work
|
|
||||||
isValidClientSession = strcmp(clientSession->syncObject.autoObject.vtable->GetClassName(&clientSession->syncObject.autoObject), "KClientSession") == 0;
|
|
||||||
|
|
||||||
if(isValidClientSession)
|
if(isValidClientSession)
|
||||||
{
|
{
|
||||||
@@ -54,7 +47,7 @@ Result SendSyncRequestHook(Handle handle)
|
|||||||
case 0x10042:
|
case 0x10042:
|
||||||
{
|
{
|
||||||
SessionInfo *info = SessionInfo_Lookup(clientSession->parentSession);
|
SessionInfo *info = SessionInfo_Lookup(clientSession->parentSession);
|
||||||
if(info != NULL && strcmp(info->name, "srv:pm") == 0)
|
if(info != NULL && kernelVersion >= SYSTEM_VERSION(2, 39, 4) && strcmp(info->name, "srv:pm") == 0)
|
||||||
{
|
{
|
||||||
res = doPublishToProcessHook(handle, cmdbuf);
|
res = doPublishToProcessHook(handle, cmdbuf);
|
||||||
skip = true;
|
skip = true;
|
||||||
@@ -112,7 +105,7 @@ Result SendSyncRequestHook(Handle handle)
|
|||||||
case 0x50100:
|
case 0x50100:
|
||||||
{
|
{
|
||||||
SessionInfo *info = SessionInfo_Lookup(clientSession->parentSession);
|
SessionInfo *info = SessionInfo_Lookup(clientSession->parentSession);
|
||||||
if(info != NULL && strcmp(info->name, "srv:") == 0)
|
if(info != NULL && (strcmp(info->name, "srv:") == 0 || (kernelVersion < SYSTEM_VERSION(2, 39, 4) && strcmp(info->name, "srv:pm") == 0)))
|
||||||
{
|
{
|
||||||
char name[9] = { 0 };
|
char name[9] = { 0 };
|
||||||
memcpy(name, cmdbuf + 1, 8);
|
memcpy(name, cmdbuf + 1, 8);
|
||||||
@@ -126,6 +119,7 @@ Result SendSyncRequestHook(Handle handle)
|
|||||||
outClientSession = (KClientSession *)KProcessHandleTable__ToKAutoObject(handleTable, (Handle)cmdbuf[3]);
|
outClientSession = (KClientSession *)KProcessHandleTable__ToKAutoObject(handleTable, (Handle)cmdbuf[3]);
|
||||||
if(outClientSession != NULL)
|
if(outClientSession != NULL)
|
||||||
{
|
{
|
||||||
|
if(strcmp(classNameOfAutoObject(&outClientSession->syncObject.autoObject), "KClientSession") == 0)
|
||||||
SessionInfo_Add(outClientSession->parentSession, name);
|
SessionInfo_Add(outClientSession->parentSession, name);
|
||||||
outClientSession->syncObject.autoObject.vtable->DecrementReferenceCount(&outClientSession->syncObject.autoObject);
|
outClientSession->syncObject.autoObject.vtable->DecrementReferenceCount(&outClientSession->syncObject.autoObject);
|
||||||
}
|
}
|
||||||
@@ -163,7 +157,7 @@ Result SendSyncRequestHook(Handle handle)
|
|||||||
case 0x4010042:
|
case 0x4010042:
|
||||||
{
|
{
|
||||||
SessionInfo *info = SessionInfo_Lookup(clientSession->parentSession);
|
SessionInfo *info = SessionInfo_Lookup(clientSession->parentSession);
|
||||||
if(info != NULL && strcmp(info->name, "srv:pm") == 0)
|
if(info != NULL && kernelVersion < SYSTEM_VERSION(2, 39, 4) && strcmp(info->name, "srv:pm") == 0)
|
||||||
{
|
{
|
||||||
res = doPublishToProcessHook(handle, cmdbuf);
|
res = doPublishToProcessHook(handle, cmdbuf);
|
||||||
skip = true;
|
skip = true;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -26,10 +26,12 @@
|
|||||||
|
|
||||||
#include "svc/SetWifiEnabled.h"
|
#include "svc/SetWifiEnabled.h"
|
||||||
|
|
||||||
void SetWifiEnabled(bool enable)
|
Result SetWifiEnabled(bool enable)
|
||||||
{
|
{
|
||||||
if(enable)
|
if(enable)
|
||||||
CFG11_WIFICNT |= 1;
|
CFG11_WIFICNT |= 1;
|
||||||
else
|
else
|
||||||
CFG11_WIFICNT &= ~1;
|
CFG11_WIFICNT &= ~1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -50,14 +50,7 @@ Result TranslateHandle(u32 *outKAddr, char *outClassName, Handle handle)
|
|||||||
if(obj == NULL)
|
if(obj == NULL)
|
||||||
return 0xD8E007F7; // invalid handle
|
return 0xD8E007F7; // invalid handle
|
||||||
|
|
||||||
if(kernelVersion >= SYSTEM_VERSION(2, 46, 0))
|
name = classNameOfAutoObject(obj);
|
||||||
{
|
|
||||||
KClassToken tok;
|
|
||||||
obj->vtable->GetClassToken(&tok, obj);
|
|
||||||
name = tok.name;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
name = obj->vtable->GetClassName(obj);
|
|
||||||
|
|
||||||
if(name == NULL) // shouldn't happen
|
if(name == NULL) // shouldn't happen
|
||||||
name = "KAutoObject";
|
name = "KAutoObject";
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
@
|
@
|
||||||
@ This program is free software: you can redistribute it and/or modify
|
@ This program is free software: you can redistribute it and/or modify
|
||||||
@ it under the terms of the GNU General Public License as published by
|
@ it under the terms of the GNU General Public License as published by
|
||||||
@@ -37,6 +37,7 @@
|
|||||||
pop {r1, r2, r12, pc}
|
pop {r1, r2, r12, pc}
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
GEN_GETINFO_WRAPPER Handle
|
||||||
GEN_GETINFO_WRAPPER System
|
GEN_GETINFO_WRAPPER System
|
||||||
GEN_GETINFO_WRAPPER Process
|
GEN_GETINFO_WRAPPER Process
|
||||||
GEN_GETINFO_WRAPPER Thread
|
GEN_GETINFO_WRAPPER Thread
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
@
|
@
|
||||||
@ This program is free software: you can redistribute it and/or modify
|
@ This program is free software: you can redistribute it and/or modify
|
||||||
@ it under the terms of the GNU General Public License as published by
|
@ it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
@
|
@
|
||||||
@ This program is free software: you can redistribute it and/or modify
|
@ This program is free software: you can redistribute it and/or modify
|
||||||
@ it under the terms of the GNU General Public License as published by
|
@ it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -109,16 +109,14 @@ bytes_read: .word 0
|
|||||||
fopen: .ascii "OPEN"
|
fopen: .ascii "OPEN"
|
||||||
.pool
|
.pool
|
||||||
|
|
||||||
.area 82, 0
|
.area 2*(80+1), 0
|
||||||
fname: .ascii "FILE"
|
fname: .ascii "FILE"
|
||||||
.endarea
|
.endarea
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
kernelcode_start:
|
kernelcode_start:
|
||||||
|
|
||||||
mrs r0, cpsr ; disable interrupts
|
msr cpsr_cxsf, #0xD3 ; disable interrupts and clear flags
|
||||||
orr r0, #0xC0
|
|
||||||
msr cpsr, r0
|
|
||||||
|
|
||||||
ldr sp, =copy_launch_stub_stack_top
|
ldr sp, =copy_launch_stub_stack_top
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -45,7 +45,8 @@
|
|||||||
|
|
||||||
#define DPAD_BUTTONS (BUTTON_LEFT | BUTTON_RIGHT | BUTTON_UP | BUTTON_DOWN)
|
#define DPAD_BUTTONS (BUTTON_LEFT | BUTTON_RIGHT | BUTTON_UP | BUTTON_DOWN)
|
||||||
#define SAFE_MODE (BUTTON_R1 | BUTTON_L1 | BUTTON_A | BUTTON_UP)
|
#define SAFE_MODE (BUTTON_R1 | BUTTON_L1 | BUTTON_A | BUTTON_UP)
|
||||||
#define SINGLE_PAYLOAD_BUTTONS (DPAD_BUTTONS | BUTTON_B | BUTTON_X | BUTTON_Y)
|
#define SINGLE_PAYLOAD_BUTTONS (BUTTON_B | BUTTON_X | BUTTON_Y)
|
||||||
#define L_PAYLOAD_BUTTONS (BUTTON_R1 | BUTTON_A | BUTTON_START | BUTTON_SELECT)
|
#define L_PAYLOAD_BUTTONS (BUTTON_R1 | BUTTON_A | BUTTON_START | BUTTON_SELECT)
|
||||||
#define MENU_BUTTONS (DPAD_BUTTONS | BUTTON_A | BUTTON_START)
|
#define MENU_BUTTONS (DPAD_BUTTONS | BUTTON_A | BUTTON_START)
|
||||||
#define PIN_BUTTONS (BUTTON_A | BUTTON_B | BUTTON_X | BUTTON_Y | DPAD_BUTTONS | BUTTON_START | BUTTON_SELECT)
|
#define PIN_BUTTONS (BUTTON_A | BUTTON_B | BUTTON_X | BUTTON_Y | DPAD_BUTTONS | BUTTON_START | BUTTON_SELECT)
|
||||||
|
#define NTRBOOT_BUTTONS (BUTTON_START | BUTTON_SELECT | BUTTON_X)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
@
|
@
|
||||||
@ This program is free software: you can redistribute it and/or modify
|
@ This program is free software: you can redistribute it and/or modify
|
||||||
@ it under the terms of the GNU General Public License as published by
|
@ it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2018 Aurora Wright, TuxSH
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -27,6 +27,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "fs.h"
|
#include "fs.h"
|
||||||
|
#include "strings.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "draw.h"
|
#include "draw.h"
|
||||||
@@ -78,25 +79,25 @@ void writeConfig(bool isConfigOptions)
|
|||||||
|
|
||||||
void configMenu(bool oldPinStatus, u32 oldPinMode)
|
void configMenu(bool oldPinStatus, u32 oldPinMode)
|
||||||
{
|
{
|
||||||
const char *multiOptionsText[] = { "Default EmuNAND: 1( ) 2( ) 3( ) 4( )",
|
static const char *multiOptionsText[] = { "Default EmuNAND: 1( ) 2( ) 3( ) 4( )",
|
||||||
"Screen brightness: 4( ) 3( ) 2( ) 1( )",
|
"Screen brightness: 4( ) 3( ) 2( ) 1( )",
|
||||||
"Splash: Off( ) Before( ) After( ) payloads",
|
"Splash: Off( ) Before( ) After( ) payloads",
|
||||||
|
"Splash duration: 1( ) 3( ) 5( ) 7( ) seconds",
|
||||||
"PIN lock: Off( ) 4( ) 6( ) 8( ) digits",
|
"PIN lock: Off( ) 4( ) 6( ) 8( ) digits",
|
||||||
"New 3DS CPU: Off( ) Clock( ) L2( ) Clock+L2( )",
|
"New 3DS CPU: Off( ) Clock( ) L2( ) Clock+L2( )",
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *singleOptionsText[] = { "( ) Autoboot EmuNAND",
|
static const char *singleOptionsText[] = { "( ) Autoboot EmuNAND",
|
||||||
"( ) Use EmuNAND FIRM if booting with R",
|
"( ) Use EmuNAND FIRM if booting with R",
|
||||||
"( ) Enable loading external FIRMs and modules",
|
"( ) Enable loading external FIRMs and modules",
|
||||||
"( ) Enable game patching",
|
"( ) Enable game patching",
|
||||||
"( ) Show NAND or user string in System Settings",
|
"( ) Show NAND or user string in System Settings",
|
||||||
"( ) Show GBA boot screen in patched AGB_FIRM",
|
"( ) Show GBA boot screen in patched AGB_FIRM",
|
||||||
"( ) Patch ARM9 access",
|
|
||||||
"( ) Set developer UNITINFO",
|
"( ) Set developer UNITINFO",
|
||||||
"( ) Disable ARM11 exception handlers",
|
"( ) Disable ARM11 exception handlers",
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *optionsDescription[] = { "Select the default EmuNAND.\n\n"
|
static const char *optionsDescription[] = { "Select the default EmuNAND.\n\n"
|
||||||
"It will be booted when no\n"
|
"It will be booted when no\n"
|
||||||
"directional pad buttons are pressed.",
|
"directional pad buttons are pressed.",
|
||||||
|
|
||||||
@@ -110,6 +111,11 @@ void configMenu(bool oldPinStatus, u32 oldPinMode)
|
|||||||
"\t* 'After payloads' displays it\n"
|
"\t* 'After payloads' displays it\n"
|
||||||
"afterwards.",
|
"afterwards.",
|
||||||
|
|
||||||
|
"Select how long the splash screen\n"
|
||||||
|
"displays.\n\n"
|
||||||
|
"This has no effect if the splash\n"
|
||||||
|
"screen is not enabled.",
|
||||||
|
|
||||||
"Activate a PIN lock.\n\n"
|
"Activate a PIN lock.\n\n"
|
||||||
"The PIN will be asked each time\n"
|
"The PIN will be asked each time\n"
|
||||||
"Luma3DS boots.\n\n"
|
"Luma3DS boots.\n\n"
|
||||||
@@ -152,7 +158,7 @@ void configMenu(bool oldPinStatus, u32 oldPinMode)
|
|||||||
|
|
||||||
"Enable overriding the region and\n"
|
"Enable overriding the region and\n"
|
||||||
"language configuration and the usage\n"
|
"language configuration and the usage\n"
|
||||||
"of patched code binaries,\n"
|
"of patched code binaries, exHeaders,\n"
|
||||||
"IPS code patches and LayeredFS\n"
|
"IPS code patches and LayeredFS\n"
|
||||||
"for specific games.\n\n"
|
"for specific games.\n\n"
|
||||||
"Also makes certain DLCs\n"
|
"Also makes certain DLCs\n"
|
||||||
@@ -174,10 +180,6 @@ void configMenu(bool oldPinStatus, u32 oldPinMode)
|
|||||||
"Enable showing the GBA boot screen\n"
|
"Enable showing the GBA boot screen\n"
|
||||||
"when booting GBA games.",
|
"when booting GBA games.",
|
||||||
|
|
||||||
"Disable ARM9 exheader access checks.\n\n"
|
|
||||||
"Only select this if you know what you\n"
|
|
||||||
"are doing!",
|
|
||||||
|
|
||||||
"Make the console be always detected\n"
|
"Make the console be always detected\n"
|
||||||
"as a development unit, and conversely.\n"
|
"as a development unit, and conversely.\n"
|
||||||
"(which breaks online features, amiibo\n"
|
"(which breaks online features, amiibo\n"
|
||||||
@@ -200,11 +202,12 @@ void configMenu(bool oldPinStatus, u32 oldPinMode)
|
|||||||
u32 enabled;
|
u32 enabled;
|
||||||
bool visible;
|
bool visible;
|
||||||
} multiOptions[] = {
|
} multiOptions[] = {
|
||||||
{ .posXs = {19, 24, 29, 34}, .visible = isSdMode },
|
{ .visible = isSdMode },
|
||||||
{ .posXs = {21, 26, 31, 36}, .visible = true },
|
{ .visible = true },
|
||||||
{ .posXs = {12, 22, 31, 0}, .visible = true },
|
{ .visible = true },
|
||||||
{ .posXs = {14, 19, 24, 29}, .visible = true },
|
{ .visible = true },
|
||||||
{ .posXs = {17, 26, 32, 44}, .visible = ISN3DS },
|
{ .visible = true },
|
||||||
|
{ .visible = ISN3DS },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct singleOption {
|
struct singleOption {
|
||||||
@@ -219,7 +222,6 @@ void configMenu(bool oldPinStatus, u32 oldPinMode)
|
|||||||
{ .visible = true },
|
{ .visible = true },
|
||||||
{ .visible = true },
|
{ .visible = true },
|
||||||
{ .visible = true },
|
{ .visible = true },
|
||||||
{ .visible = true },
|
|
||||||
{ .visible = true }
|
{ .visible = true }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -233,14 +235,28 @@ void configMenu(bool oldPinStatus, u32 oldPinMode)
|
|||||||
|
|
||||||
//Parse the existing options
|
//Parse the existing options
|
||||||
for(u32 i = 0; i < multiOptionsAmount; i++)
|
for(u32 i = 0; i < multiOptionsAmount; i++)
|
||||||
|
{
|
||||||
|
//Detect the positions where the "x" should go
|
||||||
|
u32 optionNum = 0;
|
||||||
|
for(u32 j = 0; optionNum < 4 && j < strlen(multiOptionsText[i]); j++)
|
||||||
|
if(multiOptionsText[i][j] == '(') multiOptions[i].posXs[optionNum++] = j + 1;
|
||||||
|
while(optionNum < 4) multiOptions[i].posXs[optionNum++] = 0;
|
||||||
|
|
||||||
multiOptions[i].enabled = MULTICONFIG(i);
|
multiOptions[i].enabled = MULTICONFIG(i);
|
||||||
|
}
|
||||||
for(u32 i = 0; i < singleOptionsAmount; i++)
|
for(u32 i = 0; i < singleOptionsAmount; i++)
|
||||||
singleOptions[i].enabled = CONFIG(i);
|
singleOptions[i].enabled = CONFIG(i);
|
||||||
|
|
||||||
initScreens();
|
initScreens();
|
||||||
|
|
||||||
|
static const char *bootTypes[] = { "B9S",
|
||||||
|
"B9S (ntrboot)",
|
||||||
|
"FIRM0",
|
||||||
|
"FIRM1" };
|
||||||
|
|
||||||
drawString(true, 10, 10, COLOR_TITLE, CONFIG_TITLE);
|
drawString(true, 10, 10, COLOR_TITLE, CONFIG_TITLE);
|
||||||
drawString(true, 10, 10 + SPACING_Y, COLOR_TITLE, "Press A to select, START to save");
|
drawString(true, 10, 10 + SPACING_Y, COLOR_TITLE, "Press A to select, START to save");
|
||||||
|
drawFormattedString(false, 10, SCREEN_HEIGHT - 2 * SPACING_Y, COLOR_YELLOW, "Booted from %s via %s", isSdMode ? "SD" : "CTRNAND", bootTypes[(u32)bootType]);
|
||||||
|
|
||||||
//Character to display a selected option
|
//Character to display a selected option
|
||||||
char selected = 'x';
|
char selected = 'x';
|
||||||
@@ -284,9 +300,9 @@ void configMenu(bool oldPinStatus, u32 oldPinMode)
|
|||||||
u32 pressed;
|
u32 pressed;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
pressed = waitInput(true);
|
pressed = waitInput(true) & MENU_BUTTONS;
|
||||||
}
|
}
|
||||||
while(!(pressed & MENU_BUTTONS));
|
while(!pressed);
|
||||||
|
|
||||||
if(pressed == BUTTON_START) break;
|
if(pressed == BUTTON_START) break;
|
||||||
|
|
||||||
@@ -389,12 +405,16 @@ void configMenu(bool oldPinStatus, u32 oldPinMode)
|
|||||||
for(u32 i = 0; i < singleOptionsAmount; i++)
|
for(u32 i = 0; i < singleOptionsAmount; i++)
|
||||||
configData.config |= (singleOptions[i].enabled ? 1 : 0) << i;
|
configData.config |= (singleOptions[i].enabled ? 1 : 0) << i;
|
||||||
|
|
||||||
|
writeConfig(true);
|
||||||
|
|
||||||
u32 newPinMode = MULTICONFIG(PIN);
|
u32 newPinMode = MULTICONFIG(PIN);
|
||||||
|
|
||||||
if(newPinMode != 0) newPin(oldPinStatus && newPinMode == oldPinMode, newPinMode);
|
if(newPinMode != 0) newPin(oldPinStatus && newPinMode == oldPinMode, newPinMode);
|
||||||
else if(oldPinStatus) fileDelete(PIN_FILE);
|
else if(oldPinStatus)
|
||||||
|
{
|
||||||
writeConfig(true);
|
if(!fileDelete(PIN_FILE))
|
||||||
|
error("Unable to delete PIN file");
|
||||||
|
}
|
||||||
|
|
||||||
while(HID_PAD & PIN_BUTTONS);
|
while(HID_PAD & PIN_BUTTONS);
|
||||||
wait(2000ULL);
|
wait(2000ULL);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user