Added Rosalina, see details
- see release notes - ( ͡° ͜ʖ ͡°)( ͡° ͜ʖ ͡°)( ͡° ͜ʖ ͡°) - (∩ ͡° ͜ʖ ͡°)⊃━☆゚ - ( ͡ᵔ ͜ʖ ͡ᵔ) ♫┌( ͡° ͜ʖ ͡°)┘♪ ♫└( ͡° ͜ʖ ͡°)┐♪
This commit is contained in:
parent
4429cb2095
commit
21db0d45bd
7
.github/ISSUE_TEMPLATE.md
vendored
7
.github/ISSUE_TEMPLATE.md
vendored
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
**Entrypoint (How/what you're using to boot Luma3DS):**
|
**Entrypoint (How/what you're using to boot Luma3DS):**
|
||||||
|
|
||||||
[e.g. Boot9Strap, Sighax, etc.]
|
[e.g. Boot9Strap/Sighax, etc.]
|
||||||
|
|
||||||
**Luma3DS version:**
|
**Luma3DS version:**
|
||||||
|
|
||||||
@ -62,13 +62,10 @@ 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 SVC/service/archive/ARM9 access: ( )
|
Patch ARM9 access: ( )
|
||||||
|
|
||||||
Set developer UNITINFO: ( )
|
Set developer UNITINFO: ( )
|
||||||
|
|
||||||
Enable exception handlers: ( )
|
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
||||||
|
|
||||||
|
8
.gitignore
vendored
8
.gitignore
vendored
@ -3,10 +3,16 @@ build
|
|||||||
arm11/build
|
arm11/build
|
||||||
sysmodules/loader/build
|
sysmodules/loader/build
|
||||||
chainloader/build
|
chainloader/build
|
||||||
|
rosalina/build
|
||||||
exceptions/arm9/build
|
exceptions/arm9/build
|
||||||
exceptions/arm11/build
|
exceptions/arm11/build
|
||||||
|
.vscode
|
||||||
|
.vscode/**
|
||||||
*.bin
|
*.bin
|
||||||
*.firm
|
*.firm
|
||||||
*.o
|
*.o
|
||||||
*.d
|
*.d
|
||||||
*.elf
|
*.elf
|
||||||
|
*.cxi
|
||||||
|
*.bmp
|
||||||
|
*.dmp
|
||||||
|
34
Makefile
34
Makefile
@ -4,21 +4,33 @@ ifeq ($(strip $(DEVKITARM)),)
|
|||||||
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
|
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq ($(strip $(shell firmtool -v 2>&1 | grep usage)),)
|
||||||
|
$(error "Please install firmtool v1.1 or greater")
|
||||||
|
endif
|
||||||
|
|
||||||
include $(DEVKITARM)/base_tools
|
include $(DEVKITARM)/base_tools
|
||||||
|
|
||||||
name := Luma3DS
|
name := Luma3DS
|
||||||
revision := $(shell git describe --tags --match v[0-9]* --abbrev=8 | sed 's/-[0-9]*-g/-/i')
|
revision := $(shell git describe --tags --match v[0-9]* --abbrev=8 | sed 's/-[0-9]*-g/-/i')
|
||||||
commit := $(shell git rev-parse --short=8 HEAD)
|
commit := $(shell git rev-parse --short=8 HEAD)
|
||||||
|
|
||||||
|
ifeq ($(strip $(revision)),)
|
||||||
|
revision := v0.0.0-0
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(commit)),)
|
||||||
|
commit := 0
|
||||||
|
endif
|
||||||
|
|
||||||
dir_source := source
|
dir_source := source
|
||||||
dir_patches := patches
|
dir_patches := patches
|
||||||
dir_arm11 := arm11
|
dir_arm11 := arm11
|
||||||
dir_chainloader := chainloader
|
dir_chainloader := chainloader
|
||||||
dir_exceptions := exceptions
|
dir_exceptions := exceptions
|
||||||
dir_arm9_exceptions := $(dir_exceptions)/arm9
|
dir_arm9_exceptions := $(dir_exceptions)/arm9
|
||||||
dir_arm11_exceptions := $(dir_exceptions)/arm11
|
|
||||||
dir_sysmodules := sysmodules
|
dir_sysmodules := sysmodules
|
||||||
dir_loader := $(dir_sysmodules)/loader
|
dir_loader := $(dir_sysmodules)/loader
|
||||||
|
dir_rosalina := $(dir_sysmodules)/rosalina
|
||||||
dir_build := build
|
dir_build := build
|
||||||
dir_out := out
|
dir_out := out
|
||||||
|
|
||||||
@ -30,10 +42,10 @@ objects = $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \
|
|||||||
$(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \
|
$(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \
|
||||||
$(call rwildcard, $(dir_source), *.s *.c)))
|
$(call rwildcard, $(dir_source), *.s *.c)))
|
||||||
|
|
||||||
bundled = $(dir_build)/reboot.bin.o $(dir_build)/emunand.bin.o $(dir_build)/svcGetCFWInfo.bin.o $(dir_build)/k11modules.bin.o \
|
bundled = $(dir_build)/reboot.bin.o $(dir_build)/emunand.bin.o $(dir_build)/mmuHook.bin.o $(dir_build)/k11MainHook.bin.o $(dir_build)/svcConnectToPortInitHook.bin.o $(dir_build)/svcCustomBackdoor.bin.o\
|
||||||
$(dir_build)/chainloader.bin.o $(dir_build)/arm9_exceptions.bin.o $(dir_build)/arm11_exceptions.bin.o
|
$(dir_build)/chainloader.bin.o $(dir_build)/arm9_exceptions.bin.o
|
||||||
|
|
||||||
modules = $(dir_build)/loader.cxi
|
modules = $(dir_build)/loader.cxi $(dir_build)/rosalina.cxi
|
||||||
|
|
||||||
define bin2o
|
define bin2o
|
||||||
bin2s $< | $(AS) -o $(@)
|
bin2s $< | $(AS) -o $(@)
|
||||||
@ -53,8 +65,8 @@ clean:
|
|||||||
@$(MAKE) -C $(dir_arm11) clean
|
@$(MAKE) -C $(dir_arm11) clean
|
||||||
@$(MAKE) -C $(dir_chainloader) clean
|
@$(MAKE) -C $(dir_chainloader) clean
|
||||||
@$(MAKE) -C $(dir_arm9_exceptions) clean
|
@$(MAKE) -C $(dir_arm9_exceptions) clean
|
||||||
@$(MAKE) -C $(dir_arm11_exceptions) clean
|
|
||||||
@$(MAKE) -C $(dir_loader) clean
|
@$(MAKE) -C $(dir_loader) clean
|
||||||
|
@$(MAKE) -C $(dir_rosalina) clean
|
||||||
@rm -rf $(dir_out) $(dir_build)
|
@rm -rf $(dir_out) $(dir_build)
|
||||||
|
|
||||||
.PRECIOUS: $(dir_build)/%.bin
|
.PRECIOUS: $(dir_build)/%.bin
|
||||||
@ -62,8 +74,8 @@ clean:
|
|||||||
.PHONY: $(dir_arm11)
|
.PHONY: $(dir_arm11)
|
||||||
.PHONY: $(dir_chainloader)
|
.PHONY: $(dir_chainloader)
|
||||||
.PHONY: $(dir_arm9_exceptions)
|
.PHONY: $(dir_arm9_exceptions)
|
||||||
.PHONY: $(dir_arm11_exceptions)
|
|
||||||
.PHONY: $(dir_loader)
|
.PHONY: $(dir_loader)
|
||||||
|
.PHONY: $(dir_rosalina)
|
||||||
|
|
||||||
$(dir_out)/$(name)$(revision).7z: all
|
$(dir_out)/$(name)$(revision).7z: all
|
||||||
@mkdir -p "$(@D)"
|
@mkdir -p "$(@D)"
|
||||||
@ -71,7 +83,7 @@ $(dir_out)/$(name)$(revision).7z: all
|
|||||||
|
|
||||||
$(dir_out)/boot.firm: $(dir_build)/modules.bin $(dir_build)/arm11.elf $(dir_build)/main.elf
|
$(dir_out)/boot.firm: $(dir_build)/modules.bin $(dir_build)/arm11.elf $(dir_build)/main.elf
|
||||||
@mkdir -p "$(@D)"
|
@mkdir -p "$(@D)"
|
||||||
@firmtool build $@ -S nand-retail -D $^ -A 0x1FF60000 -C XDMA XDMA NDMA
|
@firmtool build $@ -D $^ -A 0x1FF60000 -C XDMA XDMA NDMA
|
||||||
|
|
||||||
$(dir_build)/modules.bin: $(modules)
|
$(dir_build)/modules.bin: $(modules)
|
||||||
@mkdir -p "$(@D)"
|
@mkdir -p "$(@D)"
|
||||||
@ -88,6 +100,10 @@ $(dir_build)/loader.cxi: $(dir_loader)
|
|||||||
@mkdir -p "$(@D)"
|
@mkdir -p "$(@D)"
|
||||||
@$(MAKE) -C $<
|
@$(MAKE) -C $<
|
||||||
|
|
||||||
|
$(dir_build)/rosalina.cxi: $(dir_rosalina)
|
||||||
|
@mkdir -p "$(@D)"
|
||||||
|
@$(MAKE) -C $<
|
||||||
|
|
||||||
$(dir_build)/%.bin.o: $(dir_build)/%.bin
|
$(dir_build)/%.bin.o: $(dir_build)/%.bin
|
||||||
@$(bin2o)
|
@$(bin2o)
|
||||||
|
|
||||||
@ -99,10 +115,6 @@ $(dir_build)/arm9_exceptions.bin: $(dir_arm9_exceptions)
|
|||||||
@mkdir -p "$(@D)"
|
@mkdir -p "$(@D)"
|
||||||
@$(MAKE) -C $<
|
@$(MAKE) -C $<
|
||||||
|
|
||||||
$(dir_build)/arm11_exceptions.bin: $(dir_arm11_exceptions)
|
|
||||||
@mkdir -p "$(@D)"
|
|
||||||
@$(MAKE) -C $<
|
|
||||||
|
|
||||||
$(dir_build)/%.bin: $(dir_patches)/%.s
|
$(dir_build)/%.bin: $(dir_patches)/%.s
|
||||||
@mkdir -p "$(@D)"
|
@mkdir -p "$(@D)"
|
||||||
@armips $<
|
@armips $<
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
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.guide/) for details on how to get your system ready.
|
||||||
|
|
||||||
|
Since Luma3DS v8.0, Luma3DS has its own in-game menu, triggerable by `L+Start+Select` (see the release notes).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Compiling
|
## Compiling
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/** This file is part of Luma3DS
|
/*
|
||||||
* Copyright (C) 2017 Aurora Wright, TuxSH
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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
|
||||||
@ -14,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2017 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
|
||||||
@ -14,9 +14,13 @@
|
|||||||
@ You should have received a copy of the GNU General Public License
|
@ You should have received a copy of the GNU General Public License
|
||||||
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
@
|
@
|
||||||
@ Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
@ Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
@ reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
@ * Requiring preservation of specified reasonable legal notices or
|
||||||
@ Notices displayed by works containing it.
|
@ 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.
|
||||||
|
|
||||||
.section .text.start
|
.section .text.start
|
||||||
.align 4
|
.align 4
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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
|
#pragma once
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,13 +15,17 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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
|
#pragma once
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
void flushCaches(void);
|
void flushCaches(void);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2017 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
|
||||||
@ -14,9 +14,13 @@
|
|||||||
@ You should have received a copy of the GNU General Public License
|
@ You should have received a copy of the GNU General Public License
|
||||||
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
@
|
@
|
||||||
@ Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
@ Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
@ reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
@ * Requiring preservation of specified reasonable legal notices or
|
||||||
@ Notices displayed by works containing it.
|
@ 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.
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.arm
|
.arm
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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 "firm.h"
|
#include "firm.h"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2017 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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
|
#pragma once
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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 "memory.h"
|
#include "memory.h"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -33,4 +37,4 @@ void memcpy(void *dest, const void *src, u32 size)
|
|||||||
|
|
||||||
for(u32 i = 0; i < size; i++)
|
for(u32 i = 0; i < size; i++)
|
||||||
destc[i] = srcc[i];
|
destc[i] = srcc[i];
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -28,4 +32,4 @@
|
|||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
void memcpy(void *dest, const void *src, u32 size);
|
void memcpy(void *dest, const void *src, u32 size);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2017 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2017 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
|
||||||
@ -14,10 +14,13 @@
|
|||||||
@ You should have received a copy of the GNU General Public License
|
@ You should have received a copy of the GNU General Public License
|
||||||
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
@
|
@
|
||||||
@ Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
@ Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
@ reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
@ * Requiring preservation of specified reasonable legal notices or
|
||||||
@ Notices displayed by works containing it.
|
@ 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.
|
||||||
.arm
|
.arm
|
||||||
|
|
||||||
.section .text.start
|
.section .text.start
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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
|
#pragma once
|
||||||
|
@ -1,151 +0,0 @@
|
|||||||
@ This file is part of Luma3DS
|
|
||||||
@ Copyright (C) 2016 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 of GPLv3 applies 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.
|
|
||||||
|
|
||||||
.macro GEN_HANDLER name
|
|
||||||
.global \name
|
|
||||||
.type \name, %function
|
|
||||||
\name:
|
|
||||||
ldr sp, =#0xffff3000
|
|
||||||
stmfd sp!, {r0-r7}
|
|
||||||
mov r1, #\@ @ macro expansion counter
|
|
||||||
b _commonHandler
|
|
||||||
|
|
||||||
.size \name, . - \name
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.text
|
|
||||||
.arm
|
|
||||||
.align 4
|
|
||||||
|
|
||||||
.global _commonHandler
|
|
||||||
.type _commonHandler, %function
|
|
||||||
_commonHandler:
|
|
||||||
clrex
|
|
||||||
cpsid aif
|
|
||||||
mrs r2, spsr
|
|
||||||
mov r6, sp
|
|
||||||
mrs r3, cpsr
|
|
||||||
|
|
||||||
tst r2, #0x20
|
|
||||||
bne noFPUInitNorSvcBreak
|
|
||||||
sub r0, lr, #4
|
|
||||||
stmfd sp!, {lr}
|
|
||||||
bl cannotAccessVA
|
|
||||||
ldmfd sp!, {lr}
|
|
||||||
cmp r0, #0
|
|
||||||
bne noFPUInitNorSvcBreak
|
|
||||||
ldr r4, [lr, #-4]
|
|
||||||
cmp r1, #1
|
|
||||||
bne noFPUInit
|
|
||||||
|
|
||||||
lsl r4, #4
|
|
||||||
sub r4, #0xc0000000
|
|
||||||
cmp r4, #0x30000000
|
|
||||||
bcs noFPUInitNorSvcBreak
|
|
||||||
fmrx r0, fpexc
|
|
||||||
tst r0, #0x40000000
|
|
||||||
bne noFPUInitNorSvcBreak
|
|
||||||
|
|
||||||
sub lr, #4
|
|
||||||
srsfd sp!, #0x13
|
|
||||||
ldmfd sp!, {r0-r7} @ restore context
|
|
||||||
cps #0x13 @ FPU init
|
|
||||||
stmfd sp, {r0-r3, r11-lr}^
|
|
||||||
sub sp, #0x20
|
|
||||||
bl . @ will be replaced
|
|
||||||
ldmfd sp, {r0-r3, r11-lr}^
|
|
||||||
add sp, #0x20
|
|
||||||
rfefd sp!
|
|
||||||
|
|
||||||
noFPUInit:
|
|
||||||
cmp r1, #2
|
|
||||||
bne noFPUInitNorSvcBreak
|
|
||||||
ldr r5, =#0xe12fff7f
|
|
||||||
cmp r4, r5
|
|
||||||
bne noFPUInitNorSvcBreak
|
|
||||||
cps #0x13 @ switch to supervisor mode
|
|
||||||
cmp r10, #0
|
|
||||||
addne sp, #0x28
|
|
||||||
ldmfd sp, {r8-r11}^ @ implementation details of the official svc handler
|
|
||||||
ldr r2, [sp, #0x1c]
|
|
||||||
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
|
|
||||||
|
|
||||||
noFPUInitNorSvcBreak:
|
|
||||||
ands r4, r2, #0xf @ get the mode that triggered the exception
|
|
||||||
moveq r4, #0xf @ usr => sys
|
|
||||||
bic r5, r3, #0xf
|
|
||||||
orr r5, r4
|
|
||||||
msr cpsr_c, r5 @ change processor mode
|
|
||||||
stmfd r6!, {r8-lr}
|
|
||||||
msr cpsr_c, r3 @ restore processor mode
|
|
||||||
mov sp, r6
|
|
||||||
|
|
||||||
stmfd sp!, {r2,lr}
|
|
||||||
|
|
||||||
mrc p15,0,r4,c5,c0,0 @ dfsr
|
|
||||||
mrc p15,0,r5,c5,c0,1 @ ifsr
|
|
||||||
mrc p15,0,r6,c6,c0,0 @ far
|
|
||||||
fmrx r7, fpexc
|
|
||||||
fmrx r8, fpinst
|
|
||||||
fmrx r9, fpinst2
|
|
||||||
|
|
||||||
stmfd sp!, {r4-r9} @ it's a bit of a mess, but we will fix that later
|
|
||||||
@ order of saved regs now: dfsr, ifsr, far, fpexc, fpinst, fpinst2, cpsr, pc + (2/4/8), r8-r14, r0-r7
|
|
||||||
|
|
||||||
bic r3, #(1<<31)
|
|
||||||
fmxr fpexc, r3 @ clear the VFP11 exception flag (if it's set)
|
|
||||||
|
|
||||||
mov r0, sp
|
|
||||||
mrc p15,0,r2,c0,c0,5 @ CPU ID register
|
|
||||||
|
|
||||||
b mainHandler
|
|
||||||
|
|
||||||
GEN_HANDLER FIQHandler
|
|
||||||
GEN_HANDLER undefinedInstructionHandler
|
|
||||||
GEN_HANDLER prefetchAbortHandler
|
|
||||||
GEN_HANDLER dataAbortHandler
|
|
||||||
|
|
||||||
.global mcuReboot
|
|
||||||
.type mcuReboot, %function
|
|
||||||
mcuReboot:
|
|
||||||
b . @ will be replaced
|
|
||||||
|
|
||||||
.global cleanInvalidateDCacheAndDMB
|
|
||||||
.type cleanInvalidateDCacheAndDMB, %function
|
|
||||||
cleanInvalidateDCacheAndDMB:
|
|
||||||
mov r0, #0
|
|
||||||
mcr p15,0,r0,c7,c14,0 @ Clean and Invalidate Entire Data Cache
|
|
||||||
mcr p15,0,r0,c7,c10,4 @ Drain Memory Barrier
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
.global cannotAccessVA
|
|
||||||
.type cannotAccessVA, %function
|
|
||||||
cannotAccessVA:
|
|
||||||
@ Thanks yellows8 for the hint
|
|
||||||
lsr r0, #12
|
|
||||||
lsl r0, #12
|
|
||||||
mcr p15,0,r0,c7,c8,0 @ VA to PA translation with privileged read permission check
|
|
||||||
mrc p15,0,r0,c7,c4,0 @ read PA register
|
|
||||||
and r0, #1 @ failure bit
|
|
||||||
bx lr
|
|
@ -1,109 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of Luma3DS
|
|
||||||
* Copyright (C) 2016 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 of GPLv3 applies 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "handlers.h"
|
|
||||||
|
|
||||||
#define REG_DUMP_SIZE 4 * 23
|
|
||||||
#define CODE_DUMP_SIZE 48
|
|
||||||
|
|
||||||
#define CODESET_OFFSET 0xBEEFBEEF
|
|
||||||
|
|
||||||
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 || cannotAccessVA(src) || (size != 0 && cannotAccessVA((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, u32 cpuId)
|
|
||||||
{
|
|
||||||
ExceptionDumpHeader dumpHeader;
|
|
||||||
|
|
||||||
u32 registerDump[REG_DUMP_SIZE / 4];
|
|
||||||
u8 codeDump[CODE_DUMP_SIZE];
|
|
||||||
u8 *finalBuffer = cannotAccessVA((void *)0xE5000000) ? (u8 *)0xF5000000 : (u8 *)0xE5000000; //VA for 0x25000000
|
|
||||||
u8 *final = finalBuffer;
|
|
||||||
|
|
||||||
while(*(vu32 *)final == 0xDEADC0DE && *((vu32 *)final + 1) == 0xDEADCAFE);
|
|
||||||
|
|
||||||
dumpHeader.magic[0] = 0xDEADC0DE;
|
|
||||||
dumpHeader.magic[1] = 0xDEADCAFE;
|
|
||||||
dumpHeader.versionMajor = 1;
|
|
||||||
dumpHeader.versionMinor = 2;
|
|
||||||
|
|
||||||
dumpHeader.processor = 11;
|
|
||||||
dumpHeader.core = cpuId & 0xF;
|
|
||||||
dumpHeader.type = type;
|
|
||||||
|
|
||||||
dumpHeader.registerDumpSize = REG_DUMP_SIZE;
|
|
||||||
dumpHeader.codeDumpSize = CODE_DUMP_SIZE;
|
|
||||||
|
|
||||||
//Dump registers
|
|
||||||
//Current order of saved regs: dfsr, ifsr, far, fpexc, fpinst, fpinst2, cpsr, pc, r8-r12, sp, lr, r0-r7
|
|
||||||
u32 cpsr = regs[6];
|
|
||||||
u32 pc = regs[7] - (type < 3 ? (((cpsr & 0x20) != 0 && type == 1) ? 2 : 4) : 0);
|
|
||||||
|
|
||||||
registerDump[15] = pc;
|
|
||||||
registerDump[16] = cpsr;
|
|
||||||
for(u32 i = 0; i < 6; i++) registerDump[17 + i] = regs[i];
|
|
||||||
for(u32 i = 0; i < 7; i++) registerDump[8 + i] = regs[8 + i];
|
|
||||||
for(u32 i = 0; i < 8; i++) registerDump[i] = regs[15 + i];
|
|
||||||
|
|
||||||
//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
|
|
||||||
dumpHeader.codeDumpSize = copyMemory(codeDump, instr, dumpHeader.codeDumpSize, ((cpsr & 0x20) != 0) ? 2 : 4);
|
|
||||||
|
|
||||||
//Copy register dump and code dump
|
|
||||||
final = (u8 *)(finalBuffer + sizeof(ExceptionDumpHeader));
|
|
||||||
final += copyMemory(final, registerDump, dumpHeader.registerDumpSize, 1);
|
|
||||||
final += copyMemory(final, codeDump, dumpHeader.codeDumpSize, 1);
|
|
||||||
|
|
||||||
//Dump stack in place
|
|
||||||
dumpHeader.stackDumpSize = copyMemory(final, (const void *)registerDump[13], 0x1000 - (registerDump[13] & 0xFFF), 1);
|
|
||||||
final += dumpHeader.stackDumpSize;
|
|
||||||
|
|
||||||
if(!cannotAccessVA((void *)0xFFFF9004))
|
|
||||||
{
|
|
||||||
vu64 *additionalData = (vu64 *)final;
|
|
||||||
dumpHeader.additionalDataSize = 16;
|
|
||||||
vu8 *currentKCodeSet = *(vu8 **)(*(vu8 **)0xFFFF9004 + CODESET_OFFSET); //currentKProcess + CodeSet
|
|
||||||
|
|
||||||
additionalData[0] = *(vu64 *)(currentKCodeSet + 0x50); //Process name
|
|
||||||
additionalData[1] = *(vu64 *)(currentKCodeSet + 0x5C); //Title ID
|
|
||||||
}
|
|
||||||
else dumpHeader.additionalDataSize = 0;
|
|
||||||
|
|
||||||
dumpHeader.totalSize = sizeof(ExceptionDumpHeader) + dumpHeader.registerDumpSize + dumpHeader.codeDumpSize + dumpHeader.stackDumpSize + dumpHeader.additionalDataSize;
|
|
||||||
|
|
||||||
//Copy header (actually optimized by the compiler)
|
|
||||||
*(ExceptionDumpHeader *)finalBuffer = dumpHeader;
|
|
||||||
|
|
||||||
cleanInvalidateDCacheAndDMB();
|
|
||||||
mcuReboot(); //Also contains DCache-cleaning code
|
|
||||||
}
|
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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
|
#pragma once
|
||||||
@ -43,4 +47,4 @@ 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);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2017 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
|
||||||
@ -14,9 +14,13 @@
|
|||||||
@ You should have received a copy of the GNU General Public License
|
@ You should have received a copy of the GNU General Public License
|
||||||
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
@
|
@
|
||||||
@ Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
@ Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
@ reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
@ * Requiring preservation of specified reasonable legal notices or
|
||||||
@ Notices displayed by works containing it.
|
@ 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.
|
||||||
|
|
||||||
.macro GEN_HANDLER name
|
.macro GEN_HANDLER name
|
||||||
.global \name
|
.global \name
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,13 +15,17 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Thanks to the everyone who contributed in the development of this file
|
* Thanks to whoever contributed in the development of this file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "i2c.h"
|
#include "i2c.h"
|
||||||
@ -136,4 +140,4 @@ bool i2cWriteRegister(u8 dev_id, u8 reg, u8 data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,13 +15,17 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Thanks to the everyone who contributed in the development of this file
|
* Thanks to whoever contributed in the development of this file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
@ -41,4 +45,4 @@
|
|||||||
#define I2C_DEV_GYRO 10
|
#define I2C_DEV_GYRO 10
|
||||||
#define I2C_DEV_IR 13
|
#define I2C_DEV_IR 13
|
||||||
|
|
||||||
bool i2cWriteRegister(u8 dev_id, u8 reg, u8 data);
|
bool i2cWriteRegister(u8 dev_id, u8 reg, u8 data);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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 "i2c.h"
|
#include "i2c.h"
|
||||||
@ -115,4 +119,4 @@ void __attribute__((noreturn)) mainHandler(u32 *regs, u32 type)
|
|||||||
((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 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2017 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
|
||||||
@ -14,9 +14,13 @@
|
|||||||
@ You should have received a copy of the GNU General Public License
|
@ You should have received a copy of the GNU General Public License
|
||||||
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
@
|
@
|
||||||
@ Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
@ Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
@ reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
@ * Requiring preservation of specified reasonable legal notices or
|
||||||
@ Notices displayed by works containing it.
|
@ 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.
|
||||||
|
|
||||||
.section .text.start
|
.section .text.start
|
||||||
.align 4
|
.align 4
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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
|
#pragma once
|
||||||
@ -34,4 +38,4 @@ typedef uint64_t u64;
|
|||||||
typedef volatile u8 vu8;
|
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;
|
||||||
|
73
patches/k11MainHook.s
Normal file
73
patches/k11MainHook.s
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
.arm.little
|
||||||
|
|
||||||
|
.create "build/k11MainHook.bin", 0
|
||||||
|
.arm
|
||||||
|
|
||||||
|
bindSGI0:
|
||||||
|
; hook __kernel_main to bind SGI0 for own purposes
|
||||||
|
push {r0-r4, lr}
|
||||||
|
sub sp, #16 ; 3 args passed through the stack + alignment
|
||||||
|
ldr r0, [interruptManager]
|
||||||
|
adr r1, interruptEvent
|
||||||
|
mov r2, #0
|
||||||
|
mrc p15, 0, r3, c0, c0, 5
|
||||||
|
and r3, #3
|
||||||
|
mov r4, #0
|
||||||
|
str r4, [sp]
|
||||||
|
str r4, [sp, #4]
|
||||||
|
str r4, [sp, #8]
|
||||||
|
|
||||||
|
ldr r12, [InterruptManager_mapInterrupt]
|
||||||
|
blx r12
|
||||||
|
cmp r0, #0
|
||||||
|
blt .
|
||||||
|
|
||||||
|
add sp, #16
|
||||||
|
pop {r0-r4, pc}
|
||||||
|
|
||||||
|
executeCustomHandler:
|
||||||
|
push {r4, lr}
|
||||||
|
mrs r4, cpsr
|
||||||
|
adr r0, customHandler
|
||||||
|
bl convertVAToPA
|
||||||
|
orr r0, #(1 << 31)
|
||||||
|
ldr r12, [r0]
|
||||||
|
|
||||||
|
blx r12
|
||||||
|
|
||||||
|
mov r0, #0
|
||||||
|
msr cpsr_cx, r4
|
||||||
|
pop {r4, pc}
|
||||||
|
|
||||||
|
convertVAToPA:
|
||||||
|
mov r1, #0x1000
|
||||||
|
sub r1, #1
|
||||||
|
and r2, r0, r1
|
||||||
|
bic r0, r1
|
||||||
|
mcr p15, 0, r0, c7, c8, 0 ; VA to PA translation with privileged read permission check
|
||||||
|
mrc p15, 0, r0, c7, c4, 0 ; read PA register
|
||||||
|
tst r0, #1 ; failure bit
|
||||||
|
bic r0, r1
|
||||||
|
addeq r0, r2
|
||||||
|
movne r0, #0
|
||||||
|
bx lr
|
||||||
|
|
||||||
|
.pool
|
||||||
|
|
||||||
|
; Result InterruptManager::mapInterrupt(InterruptManager *this, InterruptEvent *iEvent, u32 interruptID, u32 coreID, s32 priority, bool willBeMasked, bool isLevelHighActive);
|
||||||
|
InterruptManager_mapInterrupt: .ascii "bind"
|
||||||
|
|
||||||
|
_vtable: .word executeCustomHandler
|
||||||
|
interruptEvent: .word _vtable
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
customHandler: .ascii "hdlr"
|
||||||
|
interruptManager: .word 0
|
||||||
|
L2MMUTable: .word 0
|
||||||
|
funcs: .word 0,0,0
|
||||||
|
TTBCR: .word 0
|
||||||
|
L1MMUTableAddrs: .word 0,0,0,0
|
||||||
|
kernelVersion: .word 0
|
||||||
|
CFWInfo: .word 0,0,0,0
|
||||||
|
|
||||||
|
.close
|
@ -1,105 +0,0 @@
|
|||||||
;
|
|
||||||
; This file is part of Luma3DS
|
|
||||||
; Copyright (C) 2016 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 of GPLv3 applies 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.
|
|
||||||
;
|
|
||||||
|
|
||||||
; Code originally from Subv
|
|
||||||
|
|
||||||
.arm.little
|
|
||||||
|
|
||||||
.create "build/k11modules.bin", 0
|
|
||||||
.arm
|
|
||||||
; This code searches the sm module for a specific byte pattern and patches some of the instructions
|
|
||||||
; in the code to disable service access checks when calling srv:GetServiceHandle
|
|
||||||
|
|
||||||
; It also searches the fs module for archive access check code
|
|
||||||
|
|
||||||
; Save the registers we'll be using
|
|
||||||
; Register contents:
|
|
||||||
; r4: Pointer to a pointer to the exheader of the current NCCH
|
|
||||||
; r6: Constant 0
|
|
||||||
; SP + 4: Pointer to the memory location where the NCCH text was loaded
|
|
||||||
|
|
||||||
; Execute the instruction we overwrote in our detour
|
|
||||||
ldr r0, [r4]
|
|
||||||
|
|
||||||
; Save the value of the register we use
|
|
||||||
push {r0-r4}
|
|
||||||
|
|
||||||
ldr r1, [sp, #24] ; Load the .text address
|
|
||||||
ldr r2, [r0, #0x200] ; Load the low title id of the current NCCH
|
|
||||||
ldr r0, [r0, #0x18] ; Load the size of the .text
|
|
||||||
add r0, r1, r0 ; Max bounds of the memory region
|
|
||||||
|
|
||||||
ldr r3, =0x1002 ; Low title id of the sm module
|
|
||||||
cmp r2, r3 ; Compare the low title id to the id of the sm module
|
|
||||||
bne fs_patch ; Skip if they're not the same
|
|
||||||
|
|
||||||
ldr r2, =0xE1A01006 ; mov r1, r6
|
|
||||||
|
|
||||||
loop:
|
|
||||||
cmp r0, r1
|
|
||||||
blo die ; Check if we didn't go past the bounds of the memory region
|
|
||||||
ldr r3, [r1]
|
|
||||||
cmp r3, r2
|
|
||||||
ldreqh r3, [r1, #4]
|
|
||||||
cmpeq r3, #5
|
|
||||||
addne r1, #4
|
|
||||||
bne loop
|
|
||||||
|
|
||||||
; r1 now contains the start address of the pattern we found
|
|
||||||
ldr r0, =0xE3A00001 ; mov r0, #1
|
|
||||||
str r0, [r1, #8] ; Patch the bl
|
|
||||||
b out
|
|
||||||
|
|
||||||
fs_patch: ; patch adapted from BootNTR
|
|
||||||
ldr r3, =0x1102 ; Low title id of the fs module
|
|
||||||
cmp r2, r3 ; Compare the low title id to the id of the sm module
|
|
||||||
bne out ; Skip if they're not the same
|
|
||||||
|
|
||||||
ldr r2, =0x7401 ; strb r1, [r0, #16]
|
|
||||||
ldr r3, =0x2000 ; movs r0, #0
|
|
||||||
|
|
||||||
loop_fs:
|
|
||||||
cmp r0, r1
|
|
||||||
blo die
|
|
||||||
ldrh r4, [r1]
|
|
||||||
cmp r4, r2
|
|
||||||
ldreqh r4, [r1, #2]
|
|
||||||
cmpeq r4, r3
|
|
||||||
addeq r1, #8
|
|
||||||
addne r1, #2
|
|
||||||
bne loop_fs
|
|
||||||
|
|
||||||
; r1 now contains the start address of the pattern we found
|
|
||||||
ldr r0, =0x2001 ; mov r0, #1
|
|
||||||
ldr r2, =0x4770 ; bx lr
|
|
||||||
strh r0, [r1]
|
|
||||||
strh r2, [r1, #2]
|
|
||||||
|
|
||||||
out:
|
|
||||||
pop {r0-r4} ; Restore the registers we used
|
|
||||||
bx lr ; Jump back to whoever called us
|
|
||||||
|
|
||||||
die:
|
|
||||||
b die
|
|
||||||
|
|
||||||
.pool
|
|
||||||
.close
|
|
36
patches/mmuHook.s
Normal file
36
patches/mmuHook.s
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
.arm.little
|
||||||
|
|
||||||
|
.create "build/mmuHook.bin", 0
|
||||||
|
.arm
|
||||||
|
; r2 = L1 table
|
||||||
|
; Thanks @Dazzozo for giving me that idea
|
||||||
|
; Maps physmem so that, if addr is in physmem(0, 0x30000000), it can be accessed uncached&rwx as addr|(1<<31)
|
||||||
|
; Save the value of all registers
|
||||||
|
|
||||||
|
push {r0-r1, r3-r7}
|
||||||
|
mov r0, #0
|
||||||
|
mov r1, #0x30000000 ; end address
|
||||||
|
ldr r3, =#0x40C02 ; supersection (rwx for all) of strongly ordered memory, shared
|
||||||
|
loop:
|
||||||
|
orr r4, r0, #0x80000000
|
||||||
|
orr r5, r0, r3
|
||||||
|
|
||||||
|
mov r6, #0 ;
|
||||||
|
loop2:
|
||||||
|
add r7, r6, r4,lsr #20
|
||||||
|
str r5, [r2, r7,lsl #2]
|
||||||
|
add r6, #1
|
||||||
|
cmp r6, #16
|
||||||
|
blo loop2
|
||||||
|
|
||||||
|
add r0, #0x01000000
|
||||||
|
cmp r0, r1
|
||||||
|
blo loop
|
||||||
|
pop {r0-r1, r3-r7}
|
||||||
|
|
||||||
|
mov r3, #0xe0000000 ; instruction that has been patched
|
||||||
|
bx lr
|
||||||
|
|
||||||
|
|
||||||
|
.pool
|
||||||
|
.close
|
@ -120,7 +120,7 @@ fname: .ascii "FILE"
|
|||||||
orr r0, #0xC0
|
orr r0, #0xC0
|
||||||
msr cpsr, r0
|
msr cpsr, r0
|
||||||
|
|
||||||
ldr sp, =0x27FFDF00
|
ldr sp, =copy_launch_stub_stack_top
|
||||||
|
|
||||||
ldr r0, =copy_launch_stub_addr
|
ldr r0, =copy_launch_stub_addr
|
||||||
adr r1, copy_launch_stub
|
adr r1, copy_launch_stub
|
||||||
|
43
patches/svcConnectToPortInitHook.s
Normal file
43
patches/svcConnectToPortInitHook.s
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
.arm.little
|
||||||
|
|
||||||
|
.create "build/svcConnectToPortInitHook.bin", 0
|
||||||
|
.arm
|
||||||
|
push {r0-r4, lr}
|
||||||
|
adr r0, jumpAddress
|
||||||
|
bl convertVAToPA
|
||||||
|
orr r4, r0, #(1 << 31)
|
||||||
|
|
||||||
|
loop:
|
||||||
|
ldr r12, [r4]
|
||||||
|
cmp r12, #0
|
||||||
|
bne loop_end
|
||||||
|
ldr r12, [SleepThread]
|
||||||
|
ldr r0, =(10 * 1000 * 1000)
|
||||||
|
mov r1, #0
|
||||||
|
blx r12
|
||||||
|
b loop
|
||||||
|
|
||||||
|
loop_end:
|
||||||
|
pop {r0-r4, lr}
|
||||||
|
bx r12
|
||||||
|
|
||||||
|
convertVAToPA:
|
||||||
|
mov r1, #0x1000
|
||||||
|
sub r1, #1
|
||||||
|
and r2, r0, r1
|
||||||
|
bic r0, r1
|
||||||
|
mcr p15, 0, r0, c7, c8, 0 ; VA to PA translation with privileged read permission check
|
||||||
|
mrc p15, 0, r0, c7, c4, 0 ; read PA register
|
||||||
|
tst r0, #1 ; failure bit
|
||||||
|
bic r0, r1
|
||||||
|
addeq r0, r2
|
||||||
|
movne r0, #0
|
||||||
|
bx lr
|
||||||
|
|
||||||
|
.pool
|
||||||
|
_base: .ascii "base"
|
||||||
|
jumpAddressOrig: .ascii "orig"
|
||||||
|
SleepThread: .ascii "SlpT"
|
||||||
|
jumpAddress: .word 0
|
||||||
|
|
||||||
|
.close
|
20
patches/svcCustomBackdoor.s
Normal file
20
patches/svcCustomBackdoor.s
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
.arm.little
|
||||||
|
|
||||||
|
.create "build/svcCustomBackdoor.bin", 0
|
||||||
|
.arm
|
||||||
|
|
||||||
|
; Result svcCustomBackdoor(void *func, ... <up to 3 args>)
|
||||||
|
svcCustomBackdoor:
|
||||||
|
b skip_orig
|
||||||
|
orig: .word 0
|
||||||
|
skip_orig:
|
||||||
|
push {r4, lr}
|
||||||
|
mov r4, r0
|
||||||
|
mov r0, r1
|
||||||
|
mov r1, r2
|
||||||
|
mov r2, r3
|
||||||
|
blx r4
|
||||||
|
pop {r4, pc}
|
||||||
|
|
||||||
|
.pool
|
||||||
|
.close
|
@ -1,48 +0,0 @@
|
|||||||
;
|
|
||||||
; This file is part of Luma3DS
|
|
||||||
; Copyright (C) 2016 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 of GPLv3 applies 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.
|
|
||||||
;
|
|
||||||
|
|
||||||
.arm.little
|
|
||||||
|
|
||||||
.create "build/svcGetCFWInfo.bin", 0
|
|
||||||
.arm
|
|
||||||
|
|
||||||
adr r1, infoStart
|
|
||||||
add r2, r0, #(infoEnd - infoStart)
|
|
||||||
|
|
||||||
loop:
|
|
||||||
ldrb r3, [r1], #1
|
|
||||||
strbt r3, [r0], #1
|
|
||||||
cmp r0, r2
|
|
||||||
blo loop
|
|
||||||
|
|
||||||
mov r0, #0
|
|
||||||
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
.pool
|
|
||||||
infoStart:
|
|
||||||
.ascii "LUMA" ; magic
|
|
||||||
.word 0 ; version
|
|
||||||
.word 0 ; truncated commit hash
|
|
||||||
.word 0 ; config
|
|
||||||
infoEnd:
|
|
||||||
.close
|
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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
|
#pragma once
|
||||||
@ -44,4 +48,4 @@
|
|||||||
#define SINGLE_PAYLOAD_BUTTONS (DPAD_BUTTONS | BUTTON_B | BUTTON_X | BUTTON_Y)
|
#define SINGLE_PAYLOAD_BUTTONS (DPAD_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)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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
|
#pragma once
|
||||||
@ -36,4 +40,4 @@
|
|||||||
void flushEntireDCache(void); //actually: "clean and flush"
|
void flushEntireDCache(void); //actually: "clean and flush"
|
||||||
void flushDCacheRange(void *startAddress, u32 size);
|
void flushDCacheRange(void *startAddress, u32 size);
|
||||||
void flushEntireICache(void);
|
void flushEntireICache(void);
|
||||||
void flushICacheRange(void *startAddress, u32 size);
|
void flushICacheRange(void *startAddress, u32 size);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2017 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
|
||||||
@ -14,9 +14,13 @@
|
|||||||
@ You should have received a copy of the GNU General Public License
|
@ You should have received a copy of the GNU General Public License
|
||||||
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
@
|
@
|
||||||
@ Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
@ Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
@ reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
@ * Requiring preservation of specified reasonable legal notices or
|
||||||
@ Notices displayed by works containing it.
|
@ 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.
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.arm
|
.arm
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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 "config.h"
|
#include "config.h"
|
||||||
@ -87,9 +91,8 @@ void configMenu(bool oldPinStatus, u32 oldPinMode)
|
|||||||
"( ) 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 SVC/service/archive/ARM9 access",
|
"( ) Patch ARM9 access",
|
||||||
"( ) Set developer UNITINFO",
|
"( ) Set developer UNITINFO",
|
||||||
"( ) Enable exception handlers"
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *optionsDescription[] = { "Select the default EmuNAND.\n\n"
|
const char *optionsDescription[] = { "Select the default EmuNAND.\n\n"
|
||||||
@ -172,11 +175,7 @@ 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 SVC, service, archive and ARM9\n"
|
"Disable ARM9 exheader access checks.\n\n"
|
||||||
"exheader access checks.\n\n"
|
|
||||||
"The service and archive patches\n"
|
|
||||||
"don't work on New 3DS FIRMs between\n"
|
|
||||||
"9.3 and 10.4.\n\n"
|
|
||||||
"Only select this if you know what you\n"
|
"Only select this if you know what you\n"
|
||||||
"are doing!",
|
"are doing!",
|
||||||
|
|
||||||
@ -187,11 +186,6 @@ void configMenu(bool oldPinStatus, u32 oldPinMode)
|
|||||||
"and booting some developer software).\n\n"
|
"and booting some developer software).\n\n"
|
||||||
"Only select this if you know what you\n"
|
"Only select this if you know what you\n"
|
||||||
"are doing!",
|
"are doing!",
|
||||||
|
|
||||||
"Enable Luma3DS's ARM9/ARM11 exception\n"
|
|
||||||
"handlers. Luma3DS should be ran as\n"
|
|
||||||
"boot.firm.\n\n"
|
|
||||||
"Useful for debugging."
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct multiOption {
|
struct multiOption {
|
||||||
@ -219,7 +213,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 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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
|
#pragma once
|
||||||
@ -30,7 +34,7 @@
|
|||||||
|
|
||||||
#define CONFIG_FILE "config.bin"
|
#define CONFIG_FILE "config.bin"
|
||||||
#define CONFIG_VERSIONMAJOR 1
|
#define CONFIG_VERSIONMAJOR 1
|
||||||
#define CONFIG_VERSIONMINOR 11
|
#define CONFIG_VERSIONMINOR 12
|
||||||
|
|
||||||
#define BOOTCFG_NAND BOOTCONFIG(0, 7)
|
#define BOOTCFG_NAND BOOTCONFIG(0, 7)
|
||||||
#define BOOTCFG_FIRM BOOTCONFIG(3, 7)
|
#define BOOTCFG_FIRM BOOTCONFIG(3, 7)
|
||||||
@ -42,7 +46,7 @@ enum multiOptions
|
|||||||
BRIGHTNESS,
|
BRIGHTNESS,
|
||||||
SPLASH,
|
SPLASH,
|
||||||
PIN,
|
PIN,
|
||||||
NEWCPU,
|
NEWCPU
|
||||||
};
|
};
|
||||||
|
|
||||||
enum singleOptions
|
enum singleOptions
|
||||||
@ -54,8 +58,7 @@ enum singleOptions
|
|||||||
PATCHVERSTRING,
|
PATCHVERSTRING,
|
||||||
SHOWGBABOOT,
|
SHOWGBABOOT,
|
||||||
PATCHACCESS,
|
PATCHACCESS,
|
||||||
PATCHUNITINFO,
|
PATCHUNITINFO
|
||||||
ENABLEEXCEPTIONHANDLERS
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum ConfigurationStatus
|
typedef enum ConfigurationStatus
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -193,4 +197,4 @@ u32 patchEmuNand(u8 *arm9Section, u32 kernel9Size, u8 *process9Offset, u32 proce
|
|||||||
ret += patchMpu(arm9Section, kernel9Size);
|
ret += patchMpu(arm9Section, kernel9Size);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -31,4 +35,4 @@
|
|||||||
#define ROUND_TO_4MB(a) (((a) + 0x2000 - 1) & (~(0x2000 - 1)))
|
#define ROUND_TO_4MB(a) (((a) + 0x2000 - 1) & (~(0x2000 - 1)))
|
||||||
|
|
||||||
void locateEmuNand(FirmwareSource *nandType);
|
void locateEmuNand(FirmwareSource *nandType);
|
||||||
u32 patchEmuNand(u8 *arm9Section, u32 kernel9Size, u8 *process9Offset, u32 process9Size, u8 *kernel9Address);
|
u32 patchEmuNand(u8 *arm9Section, u32 kernel9Size, u8 *process9Offset, u32 process9Size, u8 *kernel9Address);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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 "exceptions.h"
|
#include "exceptions.h"
|
||||||
@ -46,65 +50,6 @@ void installArm9Handlers(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 installArm11Handlers(u32 *exceptionsPage, u32 stackAddress, u32 codeSetOffset, u32 *dAbtHandler, u32 dAbtHandlerMemAddress)
|
|
||||||
{
|
|
||||||
u32 *endPos = exceptionsPage + 0x400;
|
|
||||||
|
|
||||||
u32 *initFPU;
|
|
||||||
for(initFPU = exceptionsPage; initFPU < endPos && *initFPU != 0xE1A0D002; initFPU++);
|
|
||||||
|
|
||||||
u32 *freeSpace;
|
|
||||||
for(freeSpace = initFPU; freeSpace < endPos && *freeSpace != 0xFFFFFFFF; freeSpace++);
|
|
||||||
|
|
||||||
u32 *mcuReboot;
|
|
||||||
for(mcuReboot = exceptionsPage; mcuReboot < endPos && *mcuReboot != 0xE3A0A0C2; mcuReboot++);
|
|
||||||
|
|
||||||
if(initFPU == endPos || freeSpace == endPos || mcuReboot == endPos || *(u32 *)((u8 *)freeSpace + arm11_exceptions_bin_size - 36) != 0xFFFFFFFF) return 1;
|
|
||||||
|
|
||||||
initFPU += 3;
|
|
||||||
mcuReboot -= 2;
|
|
||||||
|
|
||||||
memcpy(freeSpace, arm11_exceptions_bin + 32, arm11_exceptions_bin_size - 32);
|
|
||||||
|
|
||||||
exceptionsPage[1] = MAKE_BRANCH(exceptionsPage + 1, (u8 *)freeSpace + *(u32 *)(arm11_exceptions_bin + 8) - 32); //Undefined Instruction
|
|
||||||
exceptionsPage[3] = MAKE_BRANCH(exceptionsPage + 3, (u8 *)freeSpace + *(u32 *)(arm11_exceptions_bin + 12) - 32); //Prefetch Abort
|
|
||||||
exceptionsPage[7] = MAKE_BRANCH(exceptionsPage + 7, (u8 *)freeSpace + *(u32 *)(arm11_exceptions_bin + 4) - 32); //FIQ
|
|
||||||
|
|
||||||
for(u32 *pos = dAbtHandler; *pos != stackAddress; pos++)
|
|
||||||
{
|
|
||||||
u32 va_dst = 0xFFFF0000 + (((u8 *)freeSpace + *(u32 *)(arm11_exceptions_bin + 4)) - (u8 *)exceptionsPage);
|
|
||||||
u32 va_src;
|
|
||||||
switch(*pos)
|
|
||||||
{
|
|
||||||
case 0xF96D0513: //srsdb sp!, 0x13
|
|
||||||
va_src = dAbtHandlerMemAddress + ((u8 *)pos - (u8 *)dAbtHandler);
|
|
||||||
*pos = MAKE_BRANCH((u8 *)va_src, (u8 *)va_dst);
|
|
||||||
break;
|
|
||||||
case 0xE29EF004: //subs pc, lr, 4
|
|
||||||
pos++;
|
|
||||||
*pos++ = 0xE8BD000F;// pop {r0-r3}
|
|
||||||
va_src = dAbtHandlerMemAddress + ((u8 *)pos - (u8 *)dAbtHandler);
|
|
||||||
*pos = MAKE_BRANCH((u8 *)va_src, (u8 *)va_dst);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for(u32 *pos = freeSpace; pos < (u32 *)((u8 *)freeSpace + arm11_exceptions_bin_size - 32); pos++)
|
|
||||||
{
|
|
||||||
switch(*pos) //Perform relocations
|
|
||||||
{
|
|
||||||
case 0xFFFF3000: *pos = stackAddress - 0x10; break;
|
|
||||||
case 0xEBFFFFFE: *pos = MAKE_BRANCH_LINK(pos, initFPU); break;
|
|
||||||
case 0xEAFFFFFE: *pos = MAKE_BRANCH(pos, mcuReboot); break;
|
|
||||||
case 0xE12FFF1C: pos[1] = 0xFFFF0000 + 4 * (u32)(freeSpace - exceptionsPage) + pos[1] - 32; break; //bx r12 (mainHandler)
|
|
||||||
case 0xBEEFBEEF: *pos = codeSetOffset; break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void detectAndProcessExceptionDumps(void)
|
void detectAndProcessExceptionDumps(void)
|
||||||
{
|
{
|
||||||
volatile ExceptionDumpHeader *dumpHeader = (volatile ExceptionDumpHeader *)0x25000000;
|
volatile ExceptionDumpHeader *dumpHeader = (volatile ExceptionDumpHeader *)0x25000000;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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
|
#pragma once
|
||||||
|
@ -291,8 +291,6 @@ static u32 calcSDSize(u8 *csd, int type)
|
|||||||
|
|
||||||
static void InitSD()
|
static void InitSD()
|
||||||
{
|
{
|
||||||
*(vu32 *)0x10000020 = 0; //InitFS stuff
|
|
||||||
*(vu32 *)0x10000020 = 0x200; //InitFS stuff
|
|
||||||
*(vu16 *)0x10006100 &= 0xF7FFu; //SDDATACTL32
|
*(vu16 *)0x10006100 &= 0xF7FFu; //SDDATACTL32
|
||||||
*(vu16 *)0x10006100 &= 0xEFFFu; //SDDATACTL32
|
*(vu16 *)0x10006100 &= 0xEFFFu; //SDDATACTL32
|
||||||
*(vu16 *)0x10006100 |= 0x402u; //SDDATACTL32
|
*(vu16 *)0x10006100 |= 0x402u; //SDDATACTL32
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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 "firm.h"
|
#include "firm.h"
|
||||||
@ -218,13 +222,17 @@ u32 patchNativeFirm(u32 firmVersion, FirmwareSource nandType, bool loadFromStora
|
|||||||
u32 baseK11VA;
|
u32 baseK11VA;
|
||||||
u8 *freeK11Space;
|
u8 *freeK11Space;
|
||||||
u32 *arm11SvcHandler,
|
u32 *arm11SvcHandler,
|
||||||
*arm11DAbtHandler,
|
|
||||||
*arm11ExceptionsPage,
|
*arm11ExceptionsPage,
|
||||||
*arm11SvcTable = getKernel11Info(arm11Section1, firm->section[1].size, &baseK11VA, &freeK11Space, &arm11SvcHandler, &arm11DAbtHandler, &arm11ExceptionsPage);
|
*arm11SvcTable = getKernel11Info(arm11Section1, firm->section[1].size, &baseK11VA, &freeK11Space, &arm11SvcHandler, &arm11ExceptionsPage);
|
||||||
|
|
||||||
u32 kernel9Size = (u32)(process9Offset - arm9Section) - sizeof(Cxi) - 0x200,
|
u32 kernel9Size = (u32)(process9Offset - arm9Section) - sizeof(Cxi) - 0x200,
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
|
installMMUHook(arm11Section1, firm->section[1].size, &freeK11Space);
|
||||||
|
installK11MainHook(arm11Section1, firm->section[1].size, isSafeMode, baseK11VA, arm11SvcTable, arm11ExceptionsPage, &freeK11Space);
|
||||||
|
installSvcConnectToPortInitHook(arm11SvcTable, arm11ExceptionsPage, &freeK11Space);
|
||||||
|
installSvcCustomBackdoor(arm11SvcTable, &freeK11Space, arm11ExceptionsPage);
|
||||||
|
|
||||||
//Apply signature patches
|
//Apply signature patches
|
||||||
ret += patchSignatureChecks(process9Offset, process9Size);
|
ret += patchSignatureChecks(process9Offset, process9Size);
|
||||||
|
|
||||||
@ -249,16 +257,8 @@ u32 patchNativeFirm(u32 firmVersion, FirmwareSource nandType, bool loadFromStora
|
|||||||
{
|
{
|
||||||
//Apply anti-anti-DG patches
|
//Apply anti-anti-DG patches
|
||||||
ret += patchTitleInstallMinVersionChecks(process9Offset, process9Size, firmVersion);
|
ret += patchTitleInstallMinVersionChecks(process9Offset, process9Size, firmVersion);
|
||||||
|
|
||||||
//Restore svcBackdoor
|
|
||||||
ret += reimplementSvcBackdoor(arm11Section1, arm11SvcTable, baseK11VA, &freeK11Space);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Stub svc 0x59 on 11.3+ FIRMs
|
|
||||||
if(firmVersion >= (ISN3DS ? 0x2D : 0x5C)) ret += stubSvcRestrictGpuDma(arm11Section1, arm11SvcTable, baseK11VA);
|
|
||||||
|
|
||||||
ret += implementSvcGetCFWInfo(arm11Section1, arm11SvcTable, baseK11VA, &freeK11Space, isSafeMode);
|
|
||||||
|
|
||||||
//Apply UNITINFO patches
|
//Apply UNITINFO patches
|
||||||
if(doUnitinfoPatch)
|
if(doUnitinfoPatch)
|
||||||
{
|
{
|
||||||
@ -268,32 +268,14 @@ u32 patchNativeFirm(u32 firmVersion, FirmwareSource nandType, bool loadFromStora
|
|||||||
|
|
||||||
if(enableExceptionHandlers)
|
if(enableExceptionHandlers)
|
||||||
{
|
{
|
||||||
//ARM11 exception handlers
|
|
||||||
u32 codeSetOffset,
|
|
||||||
stackAddress = getInfoForArm11ExceptionHandlers(arm11Section1, firm->section[1].size, &codeSetOffset);
|
|
||||||
ret += installArm11Handlers(arm11ExceptionsPage, stackAddress, codeSetOffset, arm11DAbtHandler, baseK11VA + ((u8 *)arm11DAbtHandler - arm11Section1));
|
|
||||||
patchSvcBreak11(arm11Section1, arm11SvcTable, baseK11VA);
|
|
||||||
ret += patchKernel11Panic(arm11Section1, firm->section[1].size);
|
|
||||||
|
|
||||||
//ARM9 exception handlers
|
//ARM9 exception handlers
|
||||||
ret += patchArm9ExceptionHandlersInstall(arm9Section, kernel9Size);
|
ret += patchArm9ExceptionHandlersInstall(arm9Section, kernel9Size);
|
||||||
ret += patchSvcBreak9(arm9Section, kernel9Size, (u32)firm->section[2].address);
|
ret += patchSvcBreak9(arm9Section, kernel9Size, (u32)firm->section[2].address);
|
||||||
ret += patchKernel9Panic(arm9Section, kernel9Size);
|
ret += patchKernel9Panic(arm9Section, kernel9Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool patchAccess = CONFIG(PATCHACCESS),
|
if(CONFIG(PATCHACCESS))
|
||||||
patchGames = CONFIG(PATCHGAMES);
|
ret += patchP9AccessChecks(process9Offset, process9Size);
|
||||||
|
|
||||||
if(patchAccess || patchGames)
|
|
||||||
{
|
|
||||||
ret += patchK11ModuleChecks(arm11Section1, firm->section[1].size, &freeK11Space, patchGames);
|
|
||||||
|
|
||||||
if(patchAccess)
|
|
||||||
{
|
|
||||||
ret += patchArm11SvcAccessChecks(arm11SvcHandler, (u32 *)(arm11Section1 + firm->section[1].size));
|
|
||||||
ret += patchP9AccessChecks(process9Offset, process9Size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mergeSection0(NATIVE_FIRM, loadFromStorage);
|
mergeSection0(NATIVE_FIRM, loadFromStorage);
|
||||||
firm->section[0].size = 0;
|
firm->section[0].size = 0;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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
|
#pragma once
|
||||||
|
26
source/fmt.c
26
source/fmt.c
@ -1,3 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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.
|
||||||
|
*/
|
||||||
|
|
||||||
/* File : barebones/ee_printf.c
|
/* File : barebones/ee_printf.c
|
||||||
This file contains an implementation of ee_printf that only requires a method to output a char to a UART without pulling in library code.
|
This file contains an implementation of ee_printf that only requires a method to output a char to a UART without pulling in library code.
|
||||||
|
|
||||||
|
26
source/fmt.h
26
source/fmt.h
@ -1,3 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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
|
#pragma once
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
12
source/fs.c
12
source/fs.c
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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 "fs.h"
|
#include "fs.h"
|
||||||
|
12
source/fs.h
12
source/fs.h
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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
|
#pragma once
|
||||||
|
16
source/i2c.c
16
source/i2c.c
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,13 +15,17 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Thanks to the everyone who contributed in the development of this file
|
* Thanks to whoever contributed in the development of this file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
@ -169,4 +173,4 @@ bool i2cWriteRegister(u8 dev_id, u8 reg, u8 data)
|
|||||||
wait(3ULL);
|
wait(3ULL);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
16
source/i2c.h
16
source/i2c.h
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,13 +15,17 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Thanks to the everyone who contributed in the development of this file
|
* Thanks to whoever contributed in the development of this file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
@ -42,4 +46,4 @@
|
|||||||
#define I2C_DEV_IR 13
|
#define I2C_DEV_IR 13
|
||||||
|
|
||||||
u8 i2cReadRegister(u8 dev_id, u8 reg);
|
u8 i2cReadRegister(u8 dev_id, u8 reg);
|
||||||
bool i2cWriteRegister(u8 dev_id, u8 reg, u8 data);
|
bool i2cWriteRegister(u8 dev_id, u8 reg, u8 data);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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 "config.h"
|
#include "config.h"
|
||||||
@ -284,8 +288,7 @@ boot:
|
|||||||
bool loadFromStorage = CONFIG(LOADEXTFIRMSANDMODULES);
|
bool loadFromStorage = CONFIG(LOADEXTFIRMSANDMODULES);
|
||||||
u32 firmVersion = loadFirm(&firmType, firmSource, loadFromStorage, isSafeMode);
|
u32 firmVersion = loadFirm(&firmType, firmSource, loadFromStorage, isSafeMode);
|
||||||
|
|
||||||
bool doUnitinfoPatch = CONFIG(PATCHUNITINFO),
|
bool doUnitinfoPatch = CONFIG(PATCHUNITINFO), enableExceptionHandlers = CONFIG(PATCHUNITINFO);
|
||||||
enableExceptionHandlers = CONFIG(ENABLEEXCEPTIONHANDLERS);
|
|
||||||
u32 res;
|
u32 res;
|
||||||
switch(firmType)
|
switch(firmType)
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -36,12 +40,13 @@ void memcpy(void *dest, const void *src, u32 size)
|
|||||||
destc[i] = srcc[i];
|
destc[i] = srcc[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
void memset(void *dest, u32 filler, u32 size)
|
void *memset(void *dest, u32 value, u32 size)
|
||||||
{
|
{
|
||||||
u8 *destc = (u8 *)dest;
|
u8 *destc = (u8 *)dest;
|
||||||
|
|
||||||
for(u32 i = 0; i < size; i++)
|
for(u32 i = 0; i < size; i++) destc[i] = (u8)value;
|
||||||
destc[i] = (u8)filler;
|
|
||||||
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
void memset32(void *dest, u32 filler, u32 size)
|
void memset32(void *dest, u32 filler, u32 size)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -30,7 +34,7 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
void memcpy(void *dest, const void *src, u32 size);
|
void memcpy(void *dest, const void *src, u32 size);
|
||||||
void memset(void *dest, u32 value, u32 size) __attribute__((used));
|
void *memset(void *dest, u32 value, u32 size) __attribute__((used));
|
||||||
void memset32(void *dest, u32 filler, u32 size);
|
void memset32(void *dest, u32 filler, u32 size);
|
||||||
int memcmp(const void *buf1, const void *buf2, u32 size);
|
int memcmp(const void *buf1, const void *buf2, u32 size);
|
||||||
u8 *memsearch(u8 *startPos, const void *pattern, u32 size, u32 patternSize);
|
u8 *memsearch(u8 *startPos, const void *pattern, u32 size, u32 patternSize);
|
||||||
|
298
source/patches.c
298
source/patches.c
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -25,13 +29,13 @@
|
|||||||
* Signature patches for old FIRMs by SciresM
|
* Signature patches for old FIRMs by SciresM
|
||||||
* firmlaunches patching code originally by delebile
|
* firmlaunches patching code originally by delebile
|
||||||
* FIRM partition writes patches by delebile
|
* FIRM partition writes patches by delebile
|
||||||
* ARM11 modules patching code originally by Subv
|
|
||||||
* Idea for svcBreak patches from yellows8 and others on #3dsdev
|
* Idea for svcBreak patches from yellows8 and others on #3dsdev
|
||||||
* TWL_FIRM patches by Steveice10 and others
|
* TWL_FIRM patches by Steveice10 and others
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "patches.h"
|
#include "patches.h"
|
||||||
#include "fs.h"
|
#include "fs.h"
|
||||||
|
#include "exceptions.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
@ -51,33 +55,138 @@ u8 *getProcess9Info(u8 *pos, u32 size, u32 *process9Size, u32 *process9MemAddr)
|
|||||||
return (u8 *)off + (off->ncch.exeFsOffset + 1) * 0x200;
|
return (u8 *)off + (off->ncch.exeFsOffset + 1) * 0x200;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 *getKernel11Info(u8 *pos, u32 size, u32 *baseK11VA, u8 **freeK11Space, u32 **arm11SvcHandler, u32 **arm11DAbtHandler, u32 **arm11ExceptionsPage)
|
u32 *getKernel11Info(u8 *pos, u32 size, u32 *baseK11VA, u8 **freeK11Space, u32 **arm11SvcHandler, u32 **arm11ExceptionsPage)
|
||||||
{
|
{
|
||||||
const u8 pattern[] = {0x00, 0xB0, 0x9C, 0xE5},
|
const u8 pattern[] = {0x00, 0xB0, 0x9C, 0xE5};
|
||||||
pattern2[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
|
||||||
|
|
||||||
*arm11ExceptionsPage = (u32 *)memsearch(pos, pattern, size, sizeof(pattern));
|
*arm11ExceptionsPage = (u32 *)memsearch(pos, pattern, size, sizeof(pattern));
|
||||||
*freeK11Space = memsearch(pos, pattern2, size, sizeof(pattern2));
|
|
||||||
|
|
||||||
if(*arm11ExceptionsPage == NULL || *freeK11Space == NULL) error("Failed to get Kernel11 data.");
|
if(*arm11ExceptionsPage == NULL) error("Failed to get Kernel11 data.");
|
||||||
|
|
||||||
u32 *arm11SvcTable;
|
u32 *arm11SvcTable;
|
||||||
|
|
||||||
*arm11ExceptionsPage -= 0xB;
|
*arm11ExceptionsPage -= 0xB;
|
||||||
u32 svcOffset = (-(((*arm11ExceptionsPage)[2] & 0xFFFFFF) << 2) & (0xFFFFFF << 2)) - 8; //Branch offset + 8 for prefetch
|
u32 svcOffset = (-(((*arm11ExceptionsPage)[2] & 0xFFFFFF) << 2) & (0xFFFFFF << 2)) - 8; //Branch offset + 8 for prefetch
|
||||||
u32 dabtOffset = (-(((*arm11ExceptionsPage)[4] & 0xFFFFFF) << 2) & (0xFFFFFF << 2)) - 8; //Branch offset + 8 for prefetch
|
|
||||||
u32 pointedInstructionVA = 0xFFFF0008 - svcOffset;
|
u32 pointedInstructionVA = 0xFFFF0008 - svcOffset;
|
||||||
*baseK11VA = pointedInstructionVA & 0xFFFF0000; //This assumes that the pointed instruction has an offset < 0x10000, iirc that's always the case
|
*baseK11VA = pointedInstructionVA & 0xFFFF0000; //This assumes that the pointed instruction has an offset < 0x10000, iirc that's always the case
|
||||||
arm11SvcTable = *arm11SvcHandler = (u32 *)(pos + *(u32 *)(pos + pointedInstructionVA - *baseK11VA + 8) - *baseK11VA); //SVC handler address
|
arm11SvcTable = *arm11SvcHandler = (u32 *)(pos + *(u32 *)(pos + pointedInstructionVA - *baseK11VA + 8) - *baseK11VA); //SVC handler address
|
||||||
while(*arm11SvcTable) arm11SvcTable++; //Look for SVC0 (NULL)
|
while(*arm11SvcTable) arm11SvcTable++; //Look for SVC0 (NULL)
|
||||||
|
|
||||||
pointedInstructionVA = 0xFFFF0010 - dabtOffset;
|
u32 *freeSpace;
|
||||||
*arm11DAbtHandler = (u32 *)(pos + *(u32 *)(pos + pointedInstructionVA - *baseK11VA + 8) - *baseK11VA);
|
for(freeSpace = *arm11ExceptionsPage; freeSpace < *arm11ExceptionsPage + 0x400 && *freeSpace != 0xFFFFFFFF; freeSpace++);
|
||||||
(*freeK11Space)++;
|
*freeK11Space = (u8 *) freeSpace;
|
||||||
|
|
||||||
return arm11SvcTable;
|
return arm11SvcTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void installMMUHook(u8 *pos, u32 size, u8 **freeK11Space)
|
||||||
|
{
|
||||||
|
const u8 pattern[] = {0x0E, 0x32, 0xA0, 0xE3, 0x02, 0xC2, 0xA0, 0xE3};
|
||||||
|
|
||||||
|
u32 *off = (u32 *)memsearch(pos, pattern, size, 8);
|
||||||
|
|
||||||
|
memcpy(*freeK11Space, mmuHook_bin, mmuHook_bin_size);
|
||||||
|
*off = MAKE_BRANCH_LINK(off, *freeK11Space);
|
||||||
|
|
||||||
|
(*freeK11Space) += mmuHook_bin_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void installK11MainHook(u8 *pos, u32 size, bool isSafeMode, u32 baseK11VA, u32 *arm11SvcTable, u32 *arm11ExceptionsPage, u8 **freeK11Space)
|
||||||
|
{
|
||||||
|
const u8 pattern[] = {0x00, 0x00, 0xA0, 0xE1, 0x03, 0xF0, 0x20, 0xE3, 0xFD, 0xFF, 0xFF, 0xEA};
|
||||||
|
|
||||||
|
u32 *off = (u32 *)memsearch(pos, pattern, size, 12);
|
||||||
|
// look for cpsie i and place our function call in the nop 2 instructions before
|
||||||
|
while(*off != 0xF1080080) off--;
|
||||||
|
off -= 2;
|
||||||
|
|
||||||
|
memcpy(*freeK11Space, k11MainHook_bin, k11MainHook_bin_size);
|
||||||
|
|
||||||
|
u32 relocBase = 0xFFFF0000 + (*freeK11Space - (u8 *)arm11ExceptionsPage);
|
||||||
|
*off = MAKE_BRANCH_LINK(baseK11VA + ((u8 *)off - pos), relocBase);
|
||||||
|
|
||||||
|
off = (u32 *)(pos + (arm11SvcTable[0x50] - baseK11VA)); //svcBindInterrupt
|
||||||
|
while(off[0] != 0xE1A05000 || off[1] != 0xE2100102 || off[2] != 0x5A00000B) off++;
|
||||||
|
off--;
|
||||||
|
|
||||||
|
signed int offset = (*off & 0xFFFFFF) << 2;
|
||||||
|
offset = offset << 6 >> 6; // sign extend
|
||||||
|
offset += 8;
|
||||||
|
|
||||||
|
u32 InterruptManager_mapInterrupt = baseK11VA + ((u8 *)off - pos) + offset;
|
||||||
|
u32 interruptManager = *(u32 *)(off - 4 + (*(off - 6) & 0xFFF) / 4);
|
||||||
|
|
||||||
|
off = (u32 *)memsearch(*freeK11Space, "bind", k11MainHook_bin_size, 4);
|
||||||
|
|
||||||
|
*off++ = InterruptManager_mapInterrupt;
|
||||||
|
|
||||||
|
// Relocate stuff
|
||||||
|
*off++ += relocBase;
|
||||||
|
*off++ += relocBase;
|
||||||
|
off++;
|
||||||
|
*off++ = interruptManager;
|
||||||
|
|
||||||
|
off += 10;
|
||||||
|
|
||||||
|
struct CfwInfo
|
||||||
|
{
|
||||||
|
char magic[4];
|
||||||
|
|
||||||
|
u8 versionMajor;
|
||||||
|
u8 versionMinor;
|
||||||
|
u8 versionBuild;
|
||||||
|
u8 flags;
|
||||||
|
|
||||||
|
u32 commitHash;
|
||||||
|
|
||||||
|
u32 config;
|
||||||
|
} __attribute__((packed)) *info = (struct CfwInfo *)off;
|
||||||
|
|
||||||
|
const char *rev = REVISION;
|
||||||
|
memcpy(&info->magic, "LUMA", 4);
|
||||||
|
info->commitHash = COMMIT_HASH;
|
||||||
|
info->config = configData.config;
|
||||||
|
info->versionMajor = (u8)(rev[1] - '0');
|
||||||
|
info->versionMinor = (u8)(rev[3] - '0');
|
||||||
|
|
||||||
|
if(rev[4] == '.')
|
||||||
|
info->versionBuild = (u8)(rev[5] - '0');
|
||||||
|
|
||||||
|
const char *revpos;
|
||||||
|
for(revpos = rev + 4; *revpos != 0 && *revpos != '-'; revpos++);
|
||||||
|
bool isRelease = *revpos != '-';
|
||||||
|
|
||||||
|
if(isRelease) info->flags = 1;
|
||||||
|
if(ISN3DS) info->flags |= 1 << 4;
|
||||||
|
if(isSafeMode) info->flags |= 1 << 5;
|
||||||
|
if(isSdMode) info->flags |= 1 << 6;
|
||||||
|
|
||||||
|
(*freeK11Space) += k11MainHook_bin_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void installSvcConnectToPortInitHook(u32 *arm11SvcTable, u32 *arm11ExceptionsPage, u8 **freeK11Space)
|
||||||
|
{
|
||||||
|
u32 addr = 0xFFFF0000 + (u32)*freeK11Space - (u32)arm11ExceptionsPage;
|
||||||
|
u32 svcSleepThreadAddr = arm11SvcTable[0x0A], svcConnectToPortAddr = arm11SvcTable[0x2D];
|
||||||
|
|
||||||
|
arm11SvcTable[0x2D] = addr;
|
||||||
|
memcpy(*freeK11Space, svcConnectToPortInitHook_bin, svcConnectToPortInitHook_bin_size);
|
||||||
|
|
||||||
|
u32 *off = (u32 *)memsearch(*freeK11Space, "orig", svcConnectToPortInitHook_bin_size, 4);
|
||||||
|
off[0] = svcConnectToPortAddr;
|
||||||
|
off[1] = svcSleepThreadAddr;
|
||||||
|
|
||||||
|
(*freeK11Space) += svcConnectToPortInitHook_bin_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void installSvcCustomBackdoor(u32 *arm11SvcTable, u8 **freeK11Space, u32 *arm11ExceptionsPage)
|
||||||
|
{
|
||||||
|
memcpy(*freeK11Space, svcCustomBackdoor_bin, svcCustomBackdoor_bin_size);
|
||||||
|
*((u32 *)*freeK11Space + 1) = arm11SvcTable[0x2F]; // temporary location
|
||||||
|
arm11SvcTable[0x2F] = 0xFFFF0000 + *freeK11Space - (u8 *)arm11ExceptionsPage;
|
||||||
|
(*freeK11Space) += svcCustomBackdoor_bin_size;
|
||||||
|
}
|
||||||
|
|
||||||
u32 patchSignatureChecks(u8 *pos, u32 size)
|
u32 patchSignatureChecks(u8 *pos, u32 size)
|
||||||
{
|
{
|
||||||
//Look for signature checks
|
//Look for signature checks
|
||||||
@ -264,90 +373,6 @@ u32 patchK11ModuleLoading(u32 section0size, u32 modulesSize, u8 *pos, u32 size)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 reimplementSvcBackdoor(u8 *pos, u32 *arm11SvcTable, u32 baseK11VA, u8 **freeK11Space)
|
|
||||||
{
|
|
||||||
if(arm11SvcTable[0x7B] != 0) return 0;
|
|
||||||
|
|
||||||
//Official implementation of svcBackdoor
|
|
||||||
const u8 svcBackdoor[] = {0xFF, 0x10, 0xCD, 0xE3, //bic r1, sp, #0xff
|
|
||||||
0x0F, 0x1C, 0x81, 0xE3, //orr r1, r1, #0xf00
|
|
||||||
0x28, 0x10, 0x81, 0xE2, //add r1, r1, #0x28
|
|
||||||
0x00, 0x20, 0x91, 0xE5, //ldr r2, [r1]
|
|
||||||
0x00, 0x60, 0x22, 0xE9, //stmdb r2!, {sp, lr}
|
|
||||||
0x02, 0xD0, 0xA0, 0xE1, //mov sp, r2
|
|
||||||
0x30, 0xFF, 0x2F, 0xE1, //blx r0
|
|
||||||
0x03, 0x00, 0xBD, 0xE8, //pop {r0, r1}
|
|
||||||
0x00, 0xD0, 0xA0, 0xE1, //mov sp, r0
|
|
||||||
0x11, 0xFF, 0x2F, 0xE1}; //bx r1
|
|
||||||
|
|
||||||
if(*(u32 *)(*freeK11Space + sizeof(svcBackdoor) - 4) != 0xFFFFFFFF) return 1;
|
|
||||||
|
|
||||||
memcpy(*freeK11Space, svcBackdoor, sizeof(svcBackdoor));
|
|
||||||
|
|
||||||
arm11SvcTable[0x7B] = baseK11VA + *freeK11Space - pos;
|
|
||||||
*freeK11Space += sizeof(svcBackdoor);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 stubSvcRestrictGpuDma(u8 *pos, u32 *arm11SvcTable, u32 baseK11VA)
|
|
||||||
{
|
|
||||||
if(arm11SvcTable[0x59] != 0)
|
|
||||||
{
|
|
||||||
u32 *off = (u32 *)(pos + arm11SvcTable[0x59] - baseK11VA);
|
|
||||||
off[1] = 0xE1A00000; //replace call to inner function by a NOP
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 implementSvcGetCFWInfo(u8 *pos, u32 *arm11SvcTable, u32 baseK11VA, u8 **freeK11Space, bool isSafeMode)
|
|
||||||
{
|
|
||||||
if(*(u32 *)(*freeK11Space + svcGetCFWInfo_bin_size - 4) != 0xFFFFFFFF) return 1;
|
|
||||||
|
|
||||||
memcpy(*freeK11Space, svcGetCFWInfo_bin, svcGetCFWInfo_bin_size);
|
|
||||||
|
|
||||||
struct CfwInfo
|
|
||||||
{
|
|
||||||
char magic[4];
|
|
||||||
|
|
||||||
u8 versionMajor;
|
|
||||||
u8 versionMinor;
|
|
||||||
u8 versionBuild;
|
|
||||||
u8 flags;
|
|
||||||
|
|
||||||
u32 commitHash;
|
|
||||||
|
|
||||||
u32 config;
|
|
||||||
} __attribute__((packed)) *info = (struct CfwInfo *)memsearch(*freeK11Space, "LUMA", svcGetCFWInfo_bin_size, 4);
|
|
||||||
|
|
||||||
const char *rev = REVISION;
|
|
||||||
|
|
||||||
info->commitHash = COMMIT_HASH;
|
|
||||||
info->config = configData.config;
|
|
||||||
info->versionMajor = (u8)(rev[1] - '0');
|
|
||||||
info->versionMinor = (u8)(rev[3] - '0');
|
|
||||||
|
|
||||||
bool isRelease;
|
|
||||||
|
|
||||||
if(rev[4] == '.')
|
|
||||||
{
|
|
||||||
info->versionBuild = (u8)(rev[5] - '0');
|
|
||||||
isRelease = rev[6] == 0;
|
|
||||||
}
|
|
||||||
else isRelease = rev[4] == 0;
|
|
||||||
|
|
||||||
if(isRelease) info->flags = 1;
|
|
||||||
if(ISN3DS) info->flags |= 1 << 4;
|
|
||||||
if(isSafeMode) info->flags |= 1 << 5;
|
|
||||||
if(isSdMode) info->flags |= 1 << 6;
|
|
||||||
|
|
||||||
arm11SvcTable[0x2E] = baseK11VA + *freeK11Space - pos; //Stubbed svc
|
|
||||||
*freeK11Space += svcGetCFWInfo_bin_size;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 patchArm9ExceptionHandlersInstall(u8 *pos, u32 size)
|
u32 patchArm9ExceptionHandlersInstall(u8 *pos, u32 size)
|
||||||
{
|
{
|
||||||
const u8 pattern[] = {0x80, 0xE5, 0x40, 0x1C};
|
const u8 pattern[] = {0x80, 0xE5, 0x40, 0x1C};
|
||||||
@ -379,22 +404,6 @@ u32 patchArm9ExceptionHandlersInstall(u8 *pos, u32 size)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 getInfoForArm11ExceptionHandlers(u8 *pos, u32 size, u32 *codeSetOffset)
|
|
||||||
{
|
|
||||||
const u8 pattern[] = {0x1B, 0x50, 0xA0, 0xE3}, //Get TitleID from CodeSet
|
|
||||||
pattern2[] = {0xE8, 0x13, 0x00, 0x02}; //Call exception dispatcher
|
|
||||||
|
|
||||||
u32 *loadCodeSet = (u32 *)memsearch(pos, pattern, size, sizeof(pattern));
|
|
||||||
u8 *temp = memsearch(pos, pattern2, size, sizeof(pattern2));
|
|
||||||
|
|
||||||
if(loadCodeSet == NULL || temp == NULL) error("Failed to get ARM11 exception handlers data.");
|
|
||||||
|
|
||||||
loadCodeSet -= 2;
|
|
||||||
*codeSetOffset = *loadCodeSet & 0xFFF;
|
|
||||||
|
|
||||||
return *(u32 *)(temp + 9);
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 patchSvcBreak9(u8 *pos, u32 size, u32 kernel9Address)
|
u32 patchSvcBreak9(u8 *pos, u32 size, u32 kernel9Address)
|
||||||
{
|
{
|
||||||
//Stub svcBreak with "bkpt 65535" so we can debug the panic
|
//Stub svcBreak with "bkpt 65535" so we can debug the panic
|
||||||
@ -414,13 +423,6 @@ u32 patchSvcBreak9(u8 *pos, u32 size, u32 kernel9Address)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void patchSvcBreak11(u8 *pos, u32 *arm11SvcTable, u32 baseK11VA)
|
|
||||||
{
|
|
||||||
//Same as above, for NATIVE_FIRM ARM11
|
|
||||||
u32 *addr = (u32 *)(pos + arm11SvcTable[0x3C] - baseK11VA);
|
|
||||||
*addr = 0xE12FFF7F;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 patchKernel9Panic(u8 *pos, u32 size)
|
u32 patchKernel9Panic(u8 *pos, u32 size)
|
||||||
{
|
{
|
||||||
const u8 pattern[] = {0xFF, 0xEA, 0x04, 0xD0};
|
const u8 pattern[] = {0xFF, 0xEA, 0x04, 0xD0};
|
||||||
@ -435,19 +437,6 @@ u32 patchKernel9Panic(u8 *pos, u32 size)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 patchKernel11Panic(u8 *pos, u32 size)
|
|
||||||
{
|
|
||||||
const u8 pattern[] = {0x02, 0x0B, 0x44, 0xE2};
|
|
||||||
|
|
||||||
u32 *off = (u32 *)memsearch(pos, pattern, size, sizeof(pattern));
|
|
||||||
|
|
||||||
if(off == NULL) return 1;
|
|
||||||
|
|
||||||
*off = 0xE12FFF7E;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 patchP9AccessChecks(u8 *pos, u32 size)
|
u32 patchP9AccessChecks(u8 *pos, u32 size)
|
||||||
{
|
{
|
||||||
const u8 pattern[] = {0x00, 0x08, 0x49, 0x68};
|
const u8 pattern[] = {0x00, 0x08, 0x49, 0x68};
|
||||||
@ -463,45 +452,6 @@ u32 patchP9AccessChecks(u8 *pos, u32 size)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 patchArm11SvcAccessChecks(u32 *arm11SvcHandler, u32 *endPos)
|
|
||||||
{
|
|
||||||
while(*arm11SvcHandler != 0xE11A0E1B && arm11SvcHandler < endPos) arm11SvcHandler++; //TST R10, R11,LSL LR
|
|
||||||
|
|
||||||
if(arm11SvcHandler == endPos) return 1;
|
|
||||||
|
|
||||||
*arm11SvcHandler = 0xE3B0A001; //MOVS R10, #1
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 patchK11ModuleChecks(u8 *pos, u32 size, u8 **freeK11Space, bool patchGames)
|
|
||||||
{
|
|
||||||
/* We have to detour a function in the ARM11 kernel because builtin modules
|
|
||||||
are compressed in memory and are only decompressed at runtime */
|
|
||||||
|
|
||||||
//Check that we have enough free space
|
|
||||||
if(*(u32 *)(*freeK11Space + k11modules_bin_size - 4) != 0xFFFFFFFF) return patchGames ? 1 : 0;
|
|
||||||
|
|
||||||
//Look for the code that decompresses the .code section of the builtin modules
|
|
||||||
const u8 pattern[] = {0xE5, 0x48, 0x00, 0x9D};
|
|
||||||
|
|
||||||
u8 *temp = memsearch(pos, pattern, size, sizeof(pattern));
|
|
||||||
|
|
||||||
if(temp == NULL) return 1;
|
|
||||||
|
|
||||||
//Inject our code into the free space
|
|
||||||
memcpy(*freeK11Space, k11modules_bin, k11modules_bin_size);
|
|
||||||
|
|
||||||
u32 *off = (u32 *)(temp - 0xB);
|
|
||||||
|
|
||||||
//Inject a jump (BL) instruction to our code at the offset we found
|
|
||||||
*off = 0xEB000000 | (((((u32)*freeK11Space) - ((u32)off + 8)) >> 2) & 0xFFFFFF);
|
|
||||||
|
|
||||||
*freeK11Space += k11modules_bin_size;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 patchUnitInfoValueSet(u8 *pos, u32 size)
|
u32 patchUnitInfoValueSet(u8 *pos, u32 size)
|
||||||
{
|
{
|
||||||
//Look for UNITINFO value being set during kernel sync
|
//Look for UNITINFO value being set during kernel sync
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -25,7 +29,6 @@
|
|||||||
* Signature patches for old FIRMs by SciresM
|
* Signature patches for old FIRMs by SciresM
|
||||||
* firmlaunches patching code originally by delebile
|
* firmlaunches patching code originally by delebile
|
||||||
* FIRM partition writes patches by delebile
|
* FIRM partition writes patches by delebile
|
||||||
* ARM11 modules patching code originally by Subv
|
|
||||||
* Idea for svcBreak patches from yellows8 and others on #3dsdev
|
* Idea for svcBreak patches from yellows8 and others on #3dsdev
|
||||||
* TWL_FIRM patches by Steveice10 and others
|
* TWL_FIRM patches by Steveice10 and others
|
||||||
*/
|
*/
|
||||||
@ -37,7 +40,11 @@
|
|||||||
extern CfgData configData;
|
extern CfgData configData;
|
||||||
|
|
||||||
u8 *getProcess9Info(u8 *pos, u32 size, u32 *process9Size, u32 *process9MemAddr);
|
u8 *getProcess9Info(u8 *pos, u32 size, u32 *process9Size, u32 *process9MemAddr);
|
||||||
u32 *getKernel11Info(u8 *pos, u32 size, u32 *baseK11VA, u8 **freeK11Space, u32 **arm11SvcHandler, u32 **arm11DAbtHandler, u32 **arm11ExceptionsPage);
|
u32 *getKernel11Info(u8 *pos, u32 size, u32 *baseK11VA, u8 **freeK11Space, u32 **arm11SvcHandler, u32 **arm11ExceptionsPage);
|
||||||
|
void installMMUHook(u8 *pos, u32 size, u8 **freeK11Space);
|
||||||
|
void installK11MainHook(u8 *pos, u32 size, bool isSafeMode, u32 baseK11VA, u32 *arm11SvcTable, u32 *arm11ExceptionsPage, u8 **freeK11Space);
|
||||||
|
void installSvcConnectToPortInitHook(u32 *arm11SvcTable, u32 *arm11ExceptionsPage, u8 **freeK11Space);
|
||||||
|
void installSvcCustomBackdoor(u32 *arm11SvcTable, u8 **freeK11Space, u32 *arm11ExceptionsPage);
|
||||||
u32 patchSignatureChecks(u8 *pos, u32 size);
|
u32 patchSignatureChecks(u8 *pos, u32 size);
|
||||||
u32 patchOldSignatureChecks(u8 *pos, u32 size);
|
u32 patchOldSignatureChecks(u8 *pos, u32 size);
|
||||||
u32 patchFirmlaunches(u8 *pos, u32 size, u32 process9MemAddr);
|
u32 patchFirmlaunches(u8 *pos, u32 size, u32 process9MemAddr);
|
||||||
@ -46,20 +53,12 @@ u32 patchOldFirmWrites(u8 *pos, u32 size);
|
|||||||
u32 patchTitleInstallMinVersionChecks(u8 *pos, u32 size, u32 firmVersion);
|
u32 patchTitleInstallMinVersionChecks(u8 *pos, u32 size, u32 firmVersion);
|
||||||
u32 patchZeroKeyNcchEncryptionCheck(u8 *pos, u32 size);
|
u32 patchZeroKeyNcchEncryptionCheck(u8 *pos, u32 size);
|
||||||
u32 patchNandNcchEncryptionCheck(u8 *pos, u32 size);
|
u32 patchNandNcchEncryptionCheck(u8 *pos, u32 size);
|
||||||
u32 patchK11ModuleLoading(u32 section0size, u32 modulesSize, u8 *startPos, u32 size);
|
|
||||||
u32 patchCheckForDevCommonKey(u8 *pos, u32 size);
|
u32 patchCheckForDevCommonKey(u8 *pos, u32 size);
|
||||||
u32 reimplementSvcBackdoor(u8 *pos, u32 *arm11SvcTable, u32 baseK11VA, u8 **freeK11Space);
|
u32 patchK11ModuleLoading(u32 section0size, u32 modulesSize, u8 *startPos, u32 size);
|
||||||
u32 stubSvcRestrictGpuDma(u8 *pos, u32 *arm11SvcTable, u32 baseK11VA);
|
|
||||||
u32 implementSvcGetCFWInfo(u8 *pos, u32 *arm11SvcTable, u32 baseK11VA, u8 **freeK11Space, bool isSafeMode);
|
|
||||||
u32 patchArm9ExceptionHandlersInstall(u8 *pos, u32 size);
|
u32 patchArm9ExceptionHandlersInstall(u8 *pos, u32 size);
|
||||||
u32 getInfoForArm11ExceptionHandlers(u8 *pos, u32 size, u32 *codeSetOffset);
|
|
||||||
u32 patchSvcBreak9(u8 *pos, u32 size, u32 kernel9Address);
|
u32 patchSvcBreak9(u8 *pos, u32 size, u32 kernel9Address);
|
||||||
void patchSvcBreak11(u8 *pos, u32 *arm11SvcTable, u32 baseK11VA);
|
|
||||||
u32 patchKernel9Panic(u8 *pos, u32 size);
|
u32 patchKernel9Panic(u8 *pos, u32 size);
|
||||||
u32 patchKernel11Panic(u8 *pos, u32 size);
|
|
||||||
u32 patchP9AccessChecks(u8 *pos, u32 size);
|
u32 patchP9AccessChecks(u8 *pos, u32 size);
|
||||||
u32 patchArm11SvcAccessChecks(u32 *arm11SvcHandler, u32 *endPos);
|
|
||||||
u32 patchK11ModuleChecks(u8 *pos, u32 size, u8 **freeK11Space, bool patchGames);
|
|
||||||
u32 patchUnitInfoValueSet(u8 *pos, u32 size);
|
u32 patchUnitInfoValueSet(u8 *pos, u32 size);
|
||||||
u32 patchLgySignatureChecks(u8 *pos, u32 size);
|
u32 patchLgySignatureChecks(u8 *pos, u32 size);
|
||||||
u32 patchTwlInvalidSignatureChecks(u8 *pos, u32 size);
|
u32 patchTwlInvalidSignatureChecks(u8 *pos, u32 size);
|
||||||
|
12
source/pin.c
12
source/pin.c
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
14
source/pin.h
14
source/pin.h
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -33,4 +37,4 @@
|
|||||||
#define PIN_VERSIONMINOR 3
|
#define PIN_VERSIONMINOR 3
|
||||||
|
|
||||||
void newPin(bool allowSkipping, u32 pinMode);
|
void newPin(bool allowSkipping, u32 pinMode);
|
||||||
bool verifyPin(u32 pinMode);
|
bool verifyPin(u32 pinMode);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -25,16 +29,6 @@
|
|||||||
* Screen deinit code by tiniVi
|
* Screen deinit code by tiniVi
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
* About cache coherency:
|
|
||||||
*
|
|
||||||
* Flushing the data cache for all memory regions read from/written to by both processors is mandatory on the ARM9 processor.
|
|
||||||
* Thus, we make sure there'll be a cache miss on the ARM9 next time it's read.
|
|
||||||
* Otherwise the ARM9 won't see the changes made and things will break.
|
|
||||||
*
|
|
||||||
* On the ARM11, in the environment we're in, the MMU isn't enabled and nothing is cached.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
@ This file is part of Luma3DS
|
@ This file is part of Luma3DS
|
||||||
@ Copyright (C) 2016 Aurora Wright, TuxSH
|
@ Copyright (C) 2016-2017 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
|
||||||
@ -14,11 +14,13 @@
|
|||||||
@ You should have received a copy of the GNU General Public License
|
@ You should have received a copy of the GNU General Public License
|
||||||
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
@
|
@
|
||||||
@ Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
@ Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
@ reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
@ * Requiring preservation of specified reasonable legal notices or
|
||||||
@ Notices displayed by works containing it.
|
@ author attributions in that material or in the Appropriate Legal
|
||||||
|
@ Notices displayed by works containing it.
|
||||||
@ Thanks to the numerous people who took part in writing this file
|
@ * 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.
|
||||||
|
|
||||||
.section .text.start
|
.section .text.start
|
||||||
.align 4
|
.align 4
|
||||||
@ -58,7 +60,7 @@ _start:
|
|||||||
|
|
||||||
@ Set MPU permissions and cache settings
|
@ Set MPU permissions and cache settings
|
||||||
ldr r0, =0xFFFF001D @ ffff0000 32k | bootrom (unprotected part)
|
ldr r0, =0xFFFF001D @ ffff0000 32k | bootrom (unprotected part)
|
||||||
ldr r1, =0xFFF0801B @ fff00000 16k | dtcm
|
ldr r1, =0xFFF0001B @ fff00000 16k | dtcm
|
||||||
ldr r2, =0x01FF801D @ 01ff8000 32k | itcm
|
ldr r2, =0x01FF801D @ 01ff8000 32k | itcm
|
||||||
ldr r3, =0x08000027 @ 08000000 1M | arm9 mem
|
ldr r3, =0x08000027 @ 08000000 1M | arm9 mem
|
||||||
ldr r4, =0x10000029 @ 10000000 2M | io mem (ARM9 / first 2MB)
|
ldr r4, =0x10000029 @ 10000000 2M | io mem (ARM9 / first 2MB)
|
||||||
@ -92,6 +94,11 @@ _start:
|
|||||||
orr r0, r0, #(1<<0) @ - MPU enable
|
orr r0, r0, #(1<<0) @ - MPU enable
|
||||||
mcr p15, 0, r0, c1, c0, 0 @ write control register
|
mcr p15, 0, r0, c1, c0, 0 @ write control register
|
||||||
|
|
||||||
|
@ Fix mounting of SDMC
|
||||||
|
ldr r0, =0x10000020
|
||||||
|
mov r1, #0x340
|
||||||
|
str r1, [r0]
|
||||||
|
|
||||||
@ Clear BSS
|
@ Clear BSS
|
||||||
ldr r0, =__bss_start
|
ldr r0, =__bss_start
|
||||||
mov r1, #0
|
mov r1, #0
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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 "strings.h"
|
#include "strings.h"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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
|
#pragma once
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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
|
#pragma once
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -36,7 +40,7 @@
|
|||||||
|
|
||||||
static void startChrono(void)
|
static void startChrono(void)
|
||||||
{
|
{
|
||||||
bool isChronoStarted = false;
|
static bool isChronoStarted = false;
|
||||||
|
|
||||||
if(isChronoStarted) return;
|
if(isChronoStarted) return;
|
||||||
|
|
||||||
@ -81,7 +85,7 @@ u32 waitInput(bool isMenu)
|
|||||||
|
|
||||||
if(!key)
|
if(!key)
|
||||||
{
|
{
|
||||||
if(i2cReadRegister(I2C_DEV_MCU, 0x10) == 1) mcuPowerOff();
|
if((i2cReadRegister(I2C_DEV_MCU, 0x10) & 1)== 1) mcuPowerOff();
|
||||||
oldKey = 0;
|
oldKey = 0;
|
||||||
dPadDelay = 0;
|
dPadDelay = 0;
|
||||||
continue;
|
continue;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS
|
* This file is part of Luma3DS
|
||||||
* Copyright (C) 2016 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2017 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
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* Additional Terms 7.b of GPLv3 applies to this file: Requiring preservation of specified
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
* reasonable legal notices or author attributions in that material or in the Appropriate Legal
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
* Notices displayed by works containing it.
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -102,6 +102,7 @@ AccessControlInfo:
|
|||||||
UnmapMemoryBlock: 32
|
UnmapMemoryBlock: 32
|
||||||
WaitSynchronization1: 36
|
WaitSynchronization1: 36
|
||||||
WaitSynchronizationN: 37
|
WaitSynchronizationN: 37
|
||||||
|
KernelSetState: 124
|
||||||
InterruptNumbers:
|
InterruptNumbers:
|
||||||
ServiceAccessControl:
|
ServiceAccessControl:
|
||||||
- fs:LDR
|
- fs:LDR
|
||||||
@ -112,4 +113,4 @@ AccessControlInfo:
|
|||||||
SystemControlInfo:
|
SystemControlInfo:
|
||||||
SaveDataSize: 0KB # It doesn't use any save data.
|
SaveDataSize: 0KB # It doesn't use any save data.
|
||||||
RemasterVersion: 0
|
RemasterVersion: 0
|
||||||
StackSize: 0x1000
|
StackSize: 0x1000
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <3ds/types.h>
|
|
||||||
|
|
||||||
typedef struct __attribute__((packed))
|
|
||||||
{
|
|
||||||
char magic[4];
|
|
||||||
|
|
||||||
u8 versionMajor;
|
|
||||||
u8 versionMinor;
|
|
||||||
u8 versionBuild;
|
|
||||||
u8 flags;
|
|
||||||
|
|
||||||
u32 commitHash;
|
|
||||||
|
|
||||||
u32 config;
|
|
||||||
} CFWInfo;
|
|
||||||
|
|
||||||
u32 svcGetCFWInfo(CFWInfo *info);
|
|
@ -1,9 +0,0 @@
|
|||||||
.text
|
|
||||||
.arm
|
|
||||||
.align 4
|
|
||||||
|
|
||||||
.global svcGetCFWInfo
|
|
||||||
.type svcGetCFWInfo, %function
|
|
||||||
svcGetCFWInfo:
|
|
||||||
svc 0x2e
|
|
||||||
bx lr
|
|
@ -4,94 +4,96 @@
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u8 reserved[5];
|
u8 reserved[5];
|
||||||
u8 flag;
|
u8 flag;
|
||||||
u8 remasterversion[2];
|
u8 remasterversion[2];
|
||||||
} PACKED exheader_systeminfoflags;
|
} PACKED exheader_systeminfoflags;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u32 address;
|
u32 address;
|
||||||
u32 nummaxpages;
|
u32 nummaxpages;
|
||||||
u32 codesize;
|
u32 codesize;
|
||||||
} PACKED exheader_codesegmentinfo;
|
} PACKED exheader_codesegmentinfo;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u8 name[8];
|
u8 name[8];
|
||||||
exheader_systeminfoflags flags;
|
exheader_systeminfoflags flags;
|
||||||
exheader_codesegmentinfo text;
|
exheader_codesegmentinfo text;
|
||||||
u8 stacksize[4];
|
u8 stacksize[4];
|
||||||
exheader_codesegmentinfo ro;
|
exheader_codesegmentinfo ro;
|
||||||
u8 reserved[4];
|
u8 reserved[4];
|
||||||
exheader_codesegmentinfo data;
|
exheader_codesegmentinfo data;
|
||||||
u32 bsssize;
|
u32 bsssize;
|
||||||
} PACKED exheader_codesetinfo;
|
} PACKED exheader_codesetinfo;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u64 programid[0x30];
|
u64 programid[0x30];
|
||||||
} PACKED exheader_dependencylist;
|
} PACKED exheader_dependencylist;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u8 savedatasize[4];
|
u8 savedatasize[4];
|
||||||
u8 reserved[4];
|
u8 reserved[4];
|
||||||
u8 jumpid[8];
|
u8 jumpid[8];
|
||||||
u8 reserved2[0x30];
|
u8 reserved2[0x30];
|
||||||
} PACKED exheader_systeminfo;
|
} PACKED exheader_systeminfo;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u8 extsavedataid[8];
|
u8 extsavedataid[8];
|
||||||
u8 systemsavedataid[8];
|
u8 systemsavedataid[8];
|
||||||
u8 reserved[8];
|
u8 reserved[8];
|
||||||
u8 accessinfo[7];
|
u8 accessinfo[7];
|
||||||
u8 otherattributes;
|
u8 otherattributes;
|
||||||
} PACKED exheader_storageinfo;
|
} PACKED exheader_storageinfo;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u64 programid;
|
u64 programid;
|
||||||
u8 flags[8];
|
u32 coreversion;
|
||||||
u16 resourcelimitdescriptor[0x10];
|
u8 flags[3];
|
||||||
exheader_storageinfo storageinfo;
|
u8 priority;
|
||||||
u64 serviceaccesscontrol[0x20];
|
u16 resourcelimitdescriptor[0x10];
|
||||||
u8 reserved[0x1f];
|
exheader_storageinfo storageinfo;
|
||||||
u8 resourcelimitcategory;
|
u64 serviceaccesscontrol[0x22];
|
||||||
|
u8 reserved[0xf];
|
||||||
|
u8 resourcelimitcategory;
|
||||||
} PACKED exheader_arm11systemlocalcaps;
|
} PACKED exheader_arm11systemlocalcaps;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u32 descriptors[28];
|
u32 descriptors[28];
|
||||||
u8 reserved[0x10];
|
u8 reserved[0x10];
|
||||||
} PACKED exheader_arm11kernelcapabilities;
|
} PACKED exheader_arm11kernelcapabilities;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u8 descriptors[15];
|
u8 descriptors[15];
|
||||||
u8 descversion;
|
u8 descversion;
|
||||||
} PACKED exheader_arm9accesscontrol;
|
} PACKED exheader_arm9accesscontrol;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
// systemcontrol info {
|
// systemcontrol info {
|
||||||
// coreinfo {
|
// coreinfo {
|
||||||
exheader_codesetinfo codesetinfo;
|
exheader_codesetinfo codesetinfo;
|
||||||
exheader_dependencylist deplist;
|
exheader_dependencylist deplist;
|
||||||
// }
|
// }
|
||||||
exheader_systeminfo systeminfo;
|
exheader_systeminfo systeminfo;
|
||||||
// }
|
// }
|
||||||
// accesscontrolinfo {
|
// accesscontrolinfo {
|
||||||
exheader_arm11systemlocalcaps arm11systemlocalcaps;
|
exheader_arm11systemlocalcaps arm11systemlocalcaps;
|
||||||
exheader_arm11kernelcapabilities arm11kernelcaps;
|
exheader_arm11kernelcapabilities arm11kernelcaps;
|
||||||
exheader_arm9accesscontrol arm9accesscontrol;
|
exheader_arm9accesscontrol arm9accesscontrol;
|
||||||
// }
|
// }
|
||||||
struct {
|
struct {
|
||||||
u8 signature[0x100];
|
u8 signature[0x100];
|
||||||
u8 ncchpubkeymodulus[0x100];
|
u8 ncchpubkeymodulus[0x100];
|
||||||
exheader_arm11systemlocalcaps arm11systemlocalcaps;
|
exheader_arm11systemlocalcaps arm11systemlocalcaps;
|
||||||
exheader_arm11kernelcapabilities arm11kernelcaps;
|
exheader_arm11kernelcapabilities arm11kernelcaps;
|
||||||
exheader_arm9accesscontrol arm9accesscontrol;
|
exheader_arm9accesscontrol arm9accesscontrol;
|
||||||
} PACKED accessdesc;
|
} PACKED accessdesc;
|
||||||
} PACKED exheader_header;
|
} PACKED exheader_header;
|
||||||
|
@ -8,7 +8,8 @@
|
|||||||
#include "pxipm.h"
|
#include "pxipm.h"
|
||||||
#include "srvsys.h"
|
#include "srvsys.h"
|
||||||
|
|
||||||
#define MAX_SESSIONS 1
|
#define MAX_SESSIONS 1
|
||||||
|
#define HBLDR_3DSX_TID (*(vu64 *)0x1FF81100)
|
||||||
|
|
||||||
const char CODE_PATH[] = {0x01, 0x00, 0x00, 0x00, 0x2E, 0x63, 0x6F, 0x64, 0x65, 0x00, 0x00, 0x00};
|
const char CODE_PATH[] = {0x01, 0x00, 0x00, 0x00, 0x2E, 0x63, 0x6F, 0x64, 0x65, 0x00, 0x00, 0x00};
|
||||||
|
|
||||||
@ -163,13 +164,28 @@ static Result load_code(u64 progid, prog_addrs_t *shared, u64 prog_handle, int i
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Result HBLDR_Init(Handle *session)
|
||||||
|
{
|
||||||
|
Result res;
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
res = svcConnectToPort(session, "hb:ldr");
|
||||||
|
if (R_LEVEL(res) != RL_PERMANENT ||
|
||||||
|
R_SUMMARY(res) != RS_NOTFOUND ||
|
||||||
|
R_DESCRIPTION(res) != RD_NOT_FOUND
|
||||||
|
) break;
|
||||||
|
svcSleepThread(500000);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
static Result loader_GetProgramInfo(exheader_header *exheader, u64 prog_handle)
|
static Result loader_GetProgramInfo(exheader_header *exheader, u64 prog_handle)
|
||||||
{
|
{
|
||||||
Result res;
|
Result res;
|
||||||
|
|
||||||
if (prog_handle >> 32 == 0xFFFF0000)
|
if (prog_handle >> 32 == 0xFFFF0000)
|
||||||
{
|
{
|
||||||
return FSREG_GetProgramInfo(exheader, 1, prog_handle);
|
res = FSREG_GetProgramInfo(exheader, 1, prog_handle);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -178,13 +194,41 @@ static Result loader_GetProgramInfo(exheader_header *exheader, u64 prog_handle)
|
|||||||
//so use PXIPM if FSREG fails OR returns "info", is the second condition a bug?
|
//so use PXIPM if FSREG fails OR returns "info", is the second condition a bug?
|
||||||
if (R_FAILED(res) || (R_SUCCEEDED(res) && R_LEVEL(res) != RL_SUCCESS))
|
if (R_FAILED(res) || (R_SUCCEEDED(res) && R_LEVEL(res) != RL_SUCCESS))
|
||||||
{
|
{
|
||||||
return PXIPM_GetProgramInfo(exheader, prog_handle);
|
res = PXIPM_GetProgramInfo(exheader, prog_handle);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return FSREG_GetProgramInfo(exheader, 1, prog_handle);
|
res = FSREG_GetProgramInfo(exheader, 1, prog_handle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(res))
|
||||||
|
{
|
||||||
|
// Force always having sdmc:/ and nand:/rw permission
|
||||||
|
exheader->arm11systemlocalcaps.storageinfo.accessinfo[0] |= 0x480;
|
||||||
|
exheader->accessdesc.arm11systemlocalcaps.storageinfo.accessinfo[0] |= 0x480;
|
||||||
|
|
||||||
|
// Tweak 3dsx placeholder title exheader
|
||||||
|
if (exheader->arm11systemlocalcaps.programid == HBLDR_3DSX_TID)
|
||||||
|
{
|
||||||
|
Handle hbldr = 0;
|
||||||
|
res = HBLDR_Init(&hbldr);
|
||||||
|
if (R_SUCCEEDED(res))
|
||||||
|
{
|
||||||
|
u32* cmdbuf = getThreadCommandBuffer();
|
||||||
|
cmdbuf[0] = IPC_MakeHeader(4,0,2);
|
||||||
|
cmdbuf[1] = IPC_Desc_Buffer(sizeof(*exheader), IPC_BUFFER_RW);
|
||||||
|
cmdbuf[2] = (u32)exheader;
|
||||||
|
res = svcSendSyncRequest(hbldr);
|
||||||
|
svcCloseHandle(hbldr);
|
||||||
|
if (R_SUCCEEDED(res)) {
|
||||||
|
res = cmdbuf[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Result loader_LoadProcess(Handle *process, u64 prog_handle)
|
static Result loader_LoadProcess(Handle *process, u64 prog_handle)
|
||||||
@ -228,6 +272,39 @@ static Result loader_LoadProcess(Handle *process, u64 prog_handle)
|
|||||||
return MAKERESULT(RL_PERMANENT, RS_INVALIDARG, 1, 2);
|
return MAKERESULT(RL_PERMANENT, RS_INVALIDARG, 1, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check for 3dsx process
|
||||||
|
progid = g_exheader.arm11systemlocalcaps.programid;
|
||||||
|
if (progid == HBLDR_3DSX_TID)
|
||||||
|
{
|
||||||
|
Handle hbldr = 0;
|
||||||
|
res = HBLDR_Init(&hbldr);
|
||||||
|
if (R_FAILED(res))
|
||||||
|
{
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
u32* cmdbuf = getThreadCommandBuffer();
|
||||||
|
cmdbuf[0] = IPC_MakeHeader(1,6,0);
|
||||||
|
cmdbuf[1] = g_exheader.codesetinfo.text.address;
|
||||||
|
cmdbuf[2] = flags & 0xF00;
|
||||||
|
cmdbuf[3] = progid;
|
||||||
|
cmdbuf[4] = progid>>32;
|
||||||
|
memcpy(&cmdbuf[5], g_exheader.codesetinfo.name, 8);
|
||||||
|
res = svcSendSyncRequest(hbldr);
|
||||||
|
svcCloseHandle(hbldr);
|
||||||
|
if (R_SUCCEEDED(res))
|
||||||
|
{
|
||||||
|
res = cmdbuf[1];
|
||||||
|
}
|
||||||
|
if (R_FAILED(res))
|
||||||
|
{
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
codeset = (Handle)cmdbuf[3];
|
||||||
|
res = svcCreateProcess(process, codeset, g_exheader.arm11kernelcaps.descriptors, count);
|
||||||
|
svcCloseHandle(codeset);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
// allocate process memory
|
// allocate process memory
|
||||||
vaddr.text_addr = g_exheader.codesetinfo.text.address;
|
vaddr.text_addr = g_exheader.codesetinfo.text.address;
|
||||||
vaddr.text_size = (g_exheader.codesetinfo.text.codesize + 4095) >> 12;
|
vaddr.text_size = (g_exheader.codesetinfo.text.codesize + 4095) >> 12;
|
||||||
@ -243,7 +320,6 @@ static Result loader_LoadProcess(Handle *process, u64 prog_handle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// load code
|
// load code
|
||||||
progid = g_exheader.arm11systemlocalcaps.programid;
|
|
||||||
if ((res = load_code(progid, &shared_addr, prog_handle, g_exheader.codesetinfo.flags.flag & 1)) >= 0)
|
if ((res = load_code(progid, &shared_addr, prog_handle, g_exheader.codesetinfo.flags.flag & 1)) >= 0)
|
||||||
{
|
{
|
||||||
memcpy(&codesetinfo.name, g_exheader.codesetinfo.name, 8);
|
memcpy(&codesetinfo.name, g_exheader.codesetinfo.name, 8);
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
#include "strings.h"
|
#include "strings.h"
|
||||||
#include "fsldr.h"
|
#include "fsldr.h"
|
||||||
#include "ifile.h"
|
#include "ifile.h"
|
||||||
#include "CFWInfo.h"
|
|
||||||
#include "../build/bundled.h"
|
#include "../build/bundled.h"
|
||||||
|
|
||||||
static CFWInfo info;
|
static u32 config;
|
||||||
|
static bool isN3DS, isSafeMode, isSdMode;
|
||||||
|
|
||||||
static u32 patchMemory(u8 *start, u32 size, const void *pattern, u32 patSize, s32 offset, const void *replace, u32 repSize, u32 count)
|
static u32 patchMemory(u8 *start, u32 size, const void *pattern, u32 patSize, s32 offset, const void *replace, u32 repSize, u32 count)
|
||||||
{
|
{
|
||||||
@ -61,14 +61,14 @@ static bool dirCheck(FS_ArchiveID archiveId, const char *path)
|
|||||||
|
|
||||||
static bool openLumaFile(IFile *file, const char *path)
|
static bool openLumaFile(IFile *file, const char *path)
|
||||||
{
|
{
|
||||||
FS_ArchiveID archiveId = LOADERFLAG(ISSDMODE) ? ARCHIVE_SDMC : ARCHIVE_NAND_RW;
|
FS_ArchiveID archiveId = isSdMode ? ARCHIVE_SDMC : ARCHIVE_NAND_RW;
|
||||||
|
|
||||||
return R_SUCCEEDED(fileOpen(file, archiveId, path, FS_OPEN_READ));
|
return R_SUCCEEDED(fileOpen(file, archiveId, path, FS_OPEN_READ));
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 checkLumaDir(const char *path)
|
static u32 checkLumaDir(const char *path)
|
||||||
{
|
{
|
||||||
FS_ArchiveID archiveId = LOADERFLAG(ISSDMODE) ? ARCHIVE_SDMC : ARCHIVE_NAND_RW;
|
FS_ArchiveID archiveId = isSdMode ? ARCHIVE_SDMC : ARCHIVE_NAND_RW;
|
||||||
|
|
||||||
return dirCheck(archiveId, path) ? archiveId : 0;
|
return dirCheck(archiveId, path) ? archiveId : 0;
|
||||||
}
|
}
|
||||||
@ -76,14 +76,21 @@ static u32 checkLumaDir(const char *path)
|
|||||||
static inline void loadCFWInfo(void)
|
static inline void loadCFWInfo(void)
|
||||||
{
|
{
|
||||||
static bool infoLoaded = false;
|
static bool infoLoaded = false;
|
||||||
|
s64 out;
|
||||||
|
|
||||||
if(infoLoaded) return;
|
if(infoLoaded) return;
|
||||||
|
|
||||||
svcGetCFWInfo(&info);
|
if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 2))) svcBreak(USERBREAK_ASSERT);
|
||||||
|
config = (u32)out;
|
||||||
|
if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 4))) svcBreak(USERBREAK_ASSERT);
|
||||||
|
isN3DS = (bool)out;
|
||||||
|
if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 5))) svcBreak(USERBREAK_ASSERT);
|
||||||
|
isSafeMode = (bool)out;
|
||||||
|
if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 6))) svcBreak(USERBREAK_ASSERT);
|
||||||
|
isSdMode = (bool)out;
|
||||||
|
|
||||||
IFile file;
|
IFile file;
|
||||||
if(LOADERFLAG(ISSAFEMODE)) fileOpen(&file, ARCHIVE_SDMC, "/", FS_OPEN_READ); //Init SD card if SAFE_MODE is being booted
|
if(isSafeMode) fileOpen(&file, ARCHIVE_SDMC, "/", FS_OPEN_READ); //Init SD card if SAFE_MODE is being booted
|
||||||
|
|
||||||
infoLoaded = true;
|
infoLoaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,116 +177,6 @@ static u32 findFunctionStart(u8 *code, u32 pos)
|
|||||||
return 0xFFFFFFFF;
|
return 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u8 *getCfgOffsets(u8 *code, u32 size, u32 *CFGUHandleOffset)
|
|
||||||
{
|
|
||||||
/* HANS:
|
|
||||||
Look for error code which is known to be stored near cfg:u handle
|
|
||||||
this way we can find the right candidate
|
|
||||||
(handle should also be stored right after end of candidate function) */
|
|
||||||
|
|
||||||
u32 n = 0,
|
|
||||||
possible[24];
|
|
||||||
|
|
||||||
for(u8 *pos = code + 16; n < 24 && pos <= code + size - 16; pos += 4)
|
|
||||||
{
|
|
||||||
if(*(u32 *)pos != 0xD8A103F9) continue;
|
|
||||||
|
|
||||||
for(u32 *l = (u32 *)pos - 4; n < 24 && l < (u32 *)pos + 4; l++)
|
|
||||||
if(*l <= 0x10000000) possible[n++] = *l;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!n) return NULL;
|
|
||||||
|
|
||||||
for(u8 *CFGU_GetConfigInfoBlk2_endPos = code; CFGU_GetConfigInfoBlk2_endPos <= code + size - 12; CFGU_GetConfigInfoBlk2_endPos += 4)
|
|
||||||
{
|
|
||||||
//There might be multiple implementations of GetConfigInfoBlk2 but let's search for the one we want
|
|
||||||
u32 *cmp = (u32 *)CFGU_GetConfigInfoBlk2_endPos;
|
|
||||||
|
|
||||||
if(cmp[0] != 0xE8BD8010 || cmp[1] != 0x00010082) continue;
|
|
||||||
|
|
||||||
for(u32 i = 0; i < n; i++)
|
|
||||||
if(possible[i] == cmp[2])
|
|
||||||
{
|
|
||||||
*CFGUHandleOffset = cmp[2];
|
|
||||||
|
|
||||||
return CFGU_GetConfigInfoBlk2_endPos;
|
|
||||||
}
|
|
||||||
|
|
||||||
CFGU_GetConfigInfoBlk2_endPos += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool patchCfgGetLanguage(u8 *code, u32 size, u8 languageId, u8 *CFGU_GetConfigInfoBlk2_endPos)
|
|
||||||
{
|
|
||||||
u32 additive = findFunctionStart(code, (u32)(CFGU_GetConfigInfoBlk2_endPos - code));
|
|
||||||
|
|
||||||
if(additive == 0xFFFFFFFF) return false;
|
|
||||||
|
|
||||||
u8 *CFGU_GetConfigInfoBlk2_startPos = code + additive;
|
|
||||||
|
|
||||||
for(u8 *languageBlkIdPos = code; languageBlkIdPos <= code + size - 4; languageBlkIdPos += 4)
|
|
||||||
{
|
|
||||||
if(*(u32 *)languageBlkIdPos != 0xA0002) continue;
|
|
||||||
|
|
||||||
for(u8 *instr = languageBlkIdPos - 8; instr >= languageBlkIdPos - 0x1008 && instr >= code + 4; instr -= 4) //Should be enough
|
|
||||||
{
|
|
||||||
if(instr[3] != 0xEB) continue; //We're looking for BL
|
|
||||||
|
|
||||||
u8 *calledFunction = instr;
|
|
||||||
u32 i = 0;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
u32 low24 = (*(u32 *)calledFunction & 0x00FFFFFF) << 2;
|
|
||||||
u32 signMask = (u32)(-(low24 >> 25)) & 0xFC000000; //Sign extension
|
|
||||||
s32 offset = (s32)(low24 | signMask) + 8; //Branch offset + 8 for prefetch
|
|
||||||
|
|
||||||
calledFunction += offset;
|
|
||||||
|
|
||||||
if(calledFunction >= CFGU_GetConfigInfoBlk2_startPos - 4 && calledFunction <= CFGU_GetConfigInfoBlk2_endPos)
|
|
||||||
{
|
|
||||||
*((u32 *)instr - 1) = 0xE3A00000 | languageId; //mov r0, sp => mov r0, =languageId
|
|
||||||
*(u32 *)instr = 0xE5CD0000; //bl CFGU_GetConfigInfoBlk2 => strb r0, [sp]
|
|
||||||
*((u32 *)instr + 1) = 0xE3B00000; //(1 or 2 instructions) => movs r0, 0 (result code)
|
|
||||||
|
|
||||||
//We're done
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
while(i < 2 && calledFunction[3] == 0xEA);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void patchCfgGetRegion(u8 *code, u32 size, u8 regionId, u32 CFGUHandleOffset)
|
|
||||||
{
|
|
||||||
for(u8 *cmdPos = code; cmdPos <= code + size - 28; cmdPos += 4)
|
|
||||||
{
|
|
||||||
u32 *cmp = (u32 *)cmdPos;
|
|
||||||
|
|
||||||
if(*cmp != 0xE3A00802) continue;
|
|
||||||
|
|
||||||
for(u32 i = 1; i < 3; i++)
|
|
||||||
if((*(cmp - i) & 0xFFFF0FFF) == 0xEE1D0F70 && *((u16 *)cmdPos + 5) == 0xE59F &&
|
|
||||||
*(u32 *)(cmdPos + 16 + *((u16 *)cmdPos + 4)) == CFGUHandleOffset)
|
|
||||||
{
|
|
||||||
cmp[3] = 0xE3A00000 | regionId; //mov r0, =regionId
|
|
||||||
cmp[4] = 0xE5C40008; //strb r0, [r4, #8]
|
|
||||||
cmp[5] = 0xE3A00000; //mov r0, #0 (result code)
|
|
||||||
cmp[6] = 0xE5840004; //str r0, [r4, #4]
|
|
||||||
|
|
||||||
//The remaining, not patched, function code will do the rest for us
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool findLayeredFsSymbols(u8 *code, u32 size, u32 *fsMountArchive, u32 *fsRegisterArchive, u32 *fsTryOpenFile, u32 *fsOpenFileDirectly)
|
static inline bool findLayeredFsSymbols(u8 *code, u32 size, u32 *fsMountArchive, u32 *fsRegisterArchive, u32 *fsTryOpenFile, u32 *fsOpenFileDirectly)
|
||||||
{
|
{
|
||||||
u32 found = 0,
|
u32 found = 0,
|
||||||
@ -480,55 +377,97 @@ static inline bool loadTitleCodeSection(u64 progId, u8 *code, u32 size)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool loadTitleLocaleConfig(u64 progId, u8 *regionId, u8 *languageId)
|
static inline bool loadTitleLocaleConfig(u64 progId, u8 *mask, u8 *regionId, u8 *languageId, u8 *countryId, u8 *stateId)
|
||||||
{
|
{
|
||||||
/* Here we look for "/luma/titles/[u64 titleID in hex, uppercase]/locale.txt"
|
/* Here we look for "/luma/titles/[u64 titleID in hex, uppercase]/locale.txt"
|
||||||
If it exists it should contain, for example, "EUR IT" */
|
If it exists it should contain, for example, "EUR IT" */
|
||||||
|
|
||||||
char path[] = "/luma/titles/0000000000000000/locale.txt";
|
char path[] = "/luma/titles/0000000000000000/locale.txt";
|
||||||
progIdToStr(path + 28, progId);
|
progIdToStr(path + 28, progId);
|
||||||
|
*mask = *regionId = *languageId = *countryId = *stateId = 0;
|
||||||
|
|
||||||
IFile file;
|
IFile file;
|
||||||
|
|
||||||
if(!openLumaFile(&file, path)) return true;
|
if(!openLumaFile(&file, path)) return false;
|
||||||
|
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
u64 fileSize;
|
u64 fileSize;
|
||||||
|
|
||||||
if(R_FAILED(IFile_GetSize(&file, &fileSize)) || fileSize < 6 || fileSize > 8) goto exit;
|
if(R_FAILED(IFile_GetSize(&file, &fileSize)) || fileSize < 3) goto exit;
|
||||||
|
if(fileSize >= 12) fileSize = 12;
|
||||||
|
|
||||||
char buf[8];
|
char buf[12] = "------------";
|
||||||
u64 total;
|
u64 total;
|
||||||
|
|
||||||
if(R_FAILED(IFile_Read(&file, &total, buf, fileSize))) goto exit;
|
if(R_FAILED(IFile_Read(&file, &total, buf, fileSize))) goto exit;
|
||||||
|
|
||||||
static const char *regions[] = {"JPN", "USA", "EUR", "AUS", "CHN", "KOR", "TWN"},
|
ret = true;
|
||||||
*languages[] = {"JP", "EN", "FR", "DE", "IT", "ES", "ZH", "KO", "NL", "PT", "RU", "TW"};
|
|
||||||
|
static const char *regions[] = {"--", "JPN", "USA", "EUR", "AUS", "CHN", "KOR", "TWN"},
|
||||||
|
*languages[] = {"--", "JP", "EN", "FR", "DE", "IT", "ES", "ZH", "KO", "NL", "PT", "RU", "TW"},
|
||||||
|
*countries[] = {"--", "JP", "--", "--", "--", "--", "--", "--", "AI", "AG", "AR", "AW",
|
||||||
|
"BS", "BB", "BZ", "BO", "BR", "VG", "CA", "KY", "CL", "CO", "CR", "DM",
|
||||||
|
"DO", "EC", "SV", "GF", "GD", "GP", "GT", "GY", "HT", "HN", "JM", "MQ",
|
||||||
|
"MX", "MS", "AN", "NI", "PA", "PY", "PE", "KN", "LC", "VC", "SR", "TT",
|
||||||
|
"TC", "US", "UY", "VI", "VE", "--", "--", "--", "--", "--", "--", "--",
|
||||||
|
"--", "--", "--", "--", "AL", "AU", "AT", "BE", "BA", "BW", "BG", "HR",
|
||||||
|
"CY", "CZ", "DK", "EE", "FI", "FR", "DE", "GR", "HU", "IS", "IE", "IT",
|
||||||
|
"LV", "LS", "LI", "LT", "LU", "MK", "MT", "ME", "MZ", "NA", "NL", "NZ",
|
||||||
|
"NO", "PL", "PT", "RO", "RU", "RS", "SK", "SI", "ZA", "ES", "SZ", "SE",
|
||||||
|
"CH", "TR", "GB", "ZM", "ZW", "AZ", "MR", "ML", "NE", "TD", "SD", "ER",
|
||||||
|
"DJ", "SO", "AD", "GI", "GG", "IM", "JE", "MC", "TW", "--", "--", "--",
|
||||||
|
"--", "--", "--", "--", "KR", "--", "--", "--", "--", "--", "--", "--",
|
||||||
|
"HK", "MO", "--", "--", "--", "--", "--", "--", "ID", "SG", "TH", "PH",
|
||||||
|
"MY", "--", "--", "--", "CN", "--", "--", "--", "--", "--", "--", "--",
|
||||||
|
"AE", "IN", "EG", "OM", "QA", "KW", "SA", "SY", "BH", "JO", "--", "--",
|
||||||
|
"--", "--", "--", "--", "SM", "VA"};
|
||||||
|
|
||||||
u32 i;
|
u32 i;
|
||||||
|
|
||||||
for(i = 0; i < sizeof(regions) / sizeof(char *); i++)
|
for(i = 0; i < sizeof(regions) / sizeof(char *); i++)
|
||||||
{
|
{
|
||||||
if(memcmp(buf, regions[i], 3) == 0)
|
if(memcmp(buf, regions[i], 3) == 0 && i != 0)
|
||||||
{
|
{
|
||||||
*regionId = (u8)i;
|
*regionId = (u8)(i - 1);
|
||||||
|
*mask |= 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(i != sizeof(regions) / sizeof(char *))
|
for(i = 0; fileSize >= 6 && i < sizeof(languages) / sizeof(char *); i++)
|
||||||
{
|
{
|
||||||
for(i = 0; i < sizeof(languages) / sizeof(char *); i++)
|
if(memcmp(buf + 4, languages[i], 2) == 0 && i != 0)
|
||||||
{
|
{
|
||||||
if(memcmp(buf + 4, languages[i], 2) == 0)
|
*languageId = (u8)(i - 1);
|
||||||
{
|
*mask |= 2;
|
||||||
*languageId = (u8)i;
|
break;
|
||||||
ret = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(i = 0; fileSize >= 9 && i < sizeof(countries) / sizeof(char *); i++)
|
||||||
|
{
|
||||||
|
if(memcmp(buf + 7, countries[i], 2) == 0 && i != 0)
|
||||||
|
{
|
||||||
|
*countryId = (u8)i;
|
||||||
|
*mask |= 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(fileSize >= 12 &&
|
||||||
|
((buf[10] >= '0' && buf[10] <= '9') || (buf[10] >= 'a' && buf[10] <= 'f') || (buf[10] >= 'A' && buf[10] <= 'F')) &&
|
||||||
|
((buf[11] >= '0' && buf[11] <= '9') || (buf[11] >= 'a' && buf[11] <= 'f') || (buf[11] >= 'A' && buf[11] <= 'F')))
|
||||||
|
{
|
||||||
|
if (buf[10] >= '0' && buf[10] <= '9') *stateId = 16 * (buf[10] - '0');
|
||||||
|
else if(buf[10] >= 'a' && buf[10] <= 'f') *stateId = 16 * (buf[10] - 'a');
|
||||||
|
else if(buf[10] >= 'A' && buf[10] <= 'F') *stateId = 16 * (buf[10] - 'A');
|
||||||
|
|
||||||
|
if (buf[11] >= '0' && buf[11] <= '9') *stateId += buf[11] - '0';
|
||||||
|
else if(buf[11] >= 'a' && buf[11] <= 'f') *stateId += buf[11] - 'a';
|
||||||
|
else if(buf[11] >= 'A' && buf[11] <= 'F') *stateId += buf[11] - 'A';
|
||||||
|
|
||||||
|
*mask |= 8;
|
||||||
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
IFile_Close(&file);
|
IFile_Close(&file);
|
||||||
|
|
||||||
@ -775,7 +714,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro
|
|||||||
if(ret == 0 || (ret == 1 && progVer > 0xB)) goto error;
|
if(ret == 0 || (ret == 1 && progVer > 0xB)) goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(LOADERFLAG(ISN3DS))
|
if(isN3DS)
|
||||||
{
|
{
|
||||||
u32 cpuSetting = MULTICONFIG(NEWCPU);
|
u32 cpuSetting = MULTICONFIG(NEWCPU);
|
||||||
|
|
||||||
@ -796,6 +735,11 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro
|
|||||||
*(off + 3) = 0xE3800000 | cpuSetting;
|
*(off + 3) = 0xE3800000 | cpuSetting;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Makes ErrDisp to not start up
|
||||||
|
static const u64 errDispTid = 0x0004003000008A02ULL;
|
||||||
|
u32 *errDispTidLoc = (u32 *)memsearch(code, &errDispTid, size, sizeof(errDispTid));
|
||||||
|
*(errDispTidLoc - 6) = 0xE3A00000; // mov r0, #0
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(progId == 0x0004013000001702LL) //CFG
|
else if(progId == 0x0004013000001702LL) //CFG
|
||||||
@ -866,33 +810,6 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro
|
|||||||
)) goto error;
|
)) goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(progId == 0x0004003000008A02LL && CONFIG(ENABLEEXCEPTIONHANDLERS) && !CONFIG(PATCHUNITINFO)) //ErrDisp
|
|
||||||
{
|
|
||||||
static const u8 pattern[] = {
|
|
||||||
0x00, 0xD0, 0xE5, 0xDB
|
|
||||||
},
|
|
||||||
pattern2[] = {
|
|
||||||
0x14, 0x00, 0xD0, 0xE5, 0x01
|
|
||||||
},
|
|
||||||
patch[] = {
|
|
||||||
0x00, 0x00, 0xA0, 0xE3
|
|
||||||
};
|
|
||||||
|
|
||||||
//Patch UNITINFO checks to make ErrDisp more verbose
|
|
||||||
if(!patchMemory(code, textSize,
|
|
||||||
pattern,
|
|
||||||
sizeof(pattern), -1,
|
|
||||||
patch,
|
|
||||||
sizeof(patch), 1
|
|
||||||
) ||
|
|
||||||
patchMemory(code, textSize,
|
|
||||||
pattern2,
|
|
||||||
sizeof(pattern2), 0,
|
|
||||||
patch,
|
|
||||||
sizeof(patch), 3
|
|
||||||
) != 3) goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
else if(progId == 0x0004013000002802LL) //DLP
|
else if(progId == 0x0004013000002802LL) //DLP
|
||||||
{
|
{
|
||||||
static const u8 pattern[] = {
|
static const u8 pattern[] = {
|
||||||
@ -918,22 +835,15 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro
|
|||||||
|
|
||||||
if((u32)((progId >> 0x20) & 0xFFFFFFEDULL) == 0x00040000)
|
if((u32)((progId >> 0x20) & 0xFFFFFFEDULL) == 0x00040000)
|
||||||
{
|
{
|
||||||
u8 regionId = 0xFF,
|
u8 mask,
|
||||||
languageId;
|
regionId,
|
||||||
|
languageId,
|
||||||
|
countryId,
|
||||||
|
stateId;
|
||||||
|
|
||||||
if(!loadTitleLocaleConfig(progId, ®ionId, &languageId) ||
|
if(loadTitleLocaleConfig(progId, &mask, ®ionId, &languageId, &countryId, &stateId))
|
||||||
!patchLayeredFs(progId, code, size, textSize, roSize, dataSize, roAddress, dataAddress)) goto error;
|
svcKernelSetState(0x10001, ((u32)stateId << 24) | ((u32)countryId << 16) | ((u32)languageId << 8) | ((u32)regionId << 4) | (u32)mask , progId);
|
||||||
|
if(!patchLayeredFs(progId, code, size, textSize, roSize, dataSize, roAddress, dataAddress)) goto error;
|
||||||
if(regionId != 0xFF)
|
|
||||||
{
|
|
||||||
u32 CFGUHandleOffset;
|
|
||||||
u8 *CFGU_GetConfigInfoBlk2_endPos = getCfgOffsets(code, textSize, &CFGUHandleOffset);
|
|
||||||
|
|
||||||
if(CFGU_GetConfigInfoBlk2_endPos == NULL ||
|
|
||||||
!patchCfgGetLanguage(code, textSize, languageId, CFGU_GetConfigInfoBlk2_endPos)) goto error;
|
|
||||||
|
|
||||||
patchCfgGetRegion(code, textSize, regionId, CFGUHandleOffset);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,10 +5,9 @@
|
|||||||
#define MAKE_BRANCH(src,dst) (0xEA000000 | ((u32)((((u8 *)(dst) - (u8 *)(src)) >> 2) - 2) & 0xFFFFFF))
|
#define MAKE_BRANCH(src,dst) (0xEA000000 | ((u32)((((u8 *)(dst) - (u8 *)(src)) >> 2) - 2) & 0xFFFFFF))
|
||||||
#define MAKE_BRANCH_LINK(src,dst) (0xEB000000 | ((u32)((((u8 *)(dst) - (u8 *)(src)) >> 2) - 2) & 0xFFFFFF))
|
#define MAKE_BRANCH_LINK(src,dst) (0xEB000000 | ((u32)((((u8 *)(dst) - (u8 *)(src)) >> 2) - 2) & 0xFFFFFF))
|
||||||
|
|
||||||
#define CONFIG(a) (((info.config >> (a + 17)) & 1) != 0)
|
#define CONFIG(a) (((config >> (a + 17)) & 1) != 0)
|
||||||
#define MULTICONFIG(a) ((info.config >> (a * 2 + 7)) & 3)
|
#define MULTICONFIG(a) ((config >> (a * 2 + 7)) & 3)
|
||||||
#define BOOTCONFIG(a, b) ((info.config >> a) & b)
|
#define BOOTCONFIG(a, b) ((config >> a) & b)
|
||||||
#define LOADERFLAG(a) ((info.flags >> (a + 4)) & 1) != 0
|
|
||||||
|
|
||||||
#define BOOTCFG_NAND BOOTCONFIG(0, 7)
|
#define BOOTCFG_NAND BOOTCONFIG(0, 7)
|
||||||
#define BOOTCFG_FIRM BOOTCONFIG(3, 7)
|
#define BOOTCFG_FIRM BOOTCONFIG(3, 7)
|
||||||
@ -32,15 +31,7 @@ enum singleOptions
|
|||||||
PATCHVERSTRING,
|
PATCHVERSTRING,
|
||||||
SHOWGBABOOT,
|
SHOWGBABOOT,
|
||||||
PATCHACCESS,
|
PATCHACCESS,
|
||||||
PATCHUNITINFO,
|
PATCHUNITINFO
|
||||||
ENABLEEXCEPTIONHANDLERS
|
|
||||||
};
|
|
||||||
|
|
||||||
enum flags
|
|
||||||
{
|
|
||||||
ISN3DS = 0,
|
|
||||||
ISSAFEMODE,
|
|
||||||
ISSDMODE
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 roSize, u32 dataSize, u32 roAddress, u32 dataAddress);
|
void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 roSize, u32 dataSize, u32 roAddress, u32 dataAddress);
|
||||||
|
@ -17,4 +17,4 @@ void progIdToStr(char *strEnd, u64 progId)
|
|||||||
*strEnd-- = hexDigits[(u32)(progId & 0xF)];
|
*strEnd-- = hexDigits[(u32)(progId & 0xF)];
|
||||||
progId >>= 4;
|
progId >>= 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,4 +3,4 @@
|
|||||||
#include <3ds/types.h>
|
#include <3ds/types.h>
|
||||||
|
|
||||||
size_t strnlen(const char *string, size_t maxlen);
|
size_t strnlen(const char *string, size_t maxlen);
|
||||||
void progIdToStr(char *strEnd, u64 progId);
|
void progIdToStr(char *strEnd, u64 progId);
|
||||||
|
78
sysmodules/rosalina/Makefile
Normal file
78
sysmodules/rosalina/Makefile
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
rwildcard = $(foreach d, $(wildcard $1*), $(filter $(subst *, %, $2), $d) $(call rwildcard, $d/, $2))
|
||||||
|
|
||||||
|
ifeq ($(strip $(DEVKITARM)),)
|
||||||
|
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
|
||||||
|
endif
|
||||||
|
|
||||||
|
include $(DEVKITARM)/3ds_rules
|
||||||
|
|
||||||
|
CC := arm-none-eabi-gcc
|
||||||
|
AS := arm-none-eabi-as
|
||||||
|
LD := arm-none-eabi-ld
|
||||||
|
OC := arm-none-eabi-objcopy
|
||||||
|
|
||||||
|
name := $(shell basename $(CURDIR))
|
||||||
|
|
||||||
|
dir_source := source
|
||||||
|
dir_include := include
|
||||||
|
dir_build := build
|
||||||
|
dir_out := ../../$(dir_build)
|
||||||
|
dir_kernel_extension := kernel_extension
|
||||||
|
|
||||||
|
LIBS := -lctru
|
||||||
|
LIBDIRS := $(CTRULIB)
|
||||||
|
LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
|
||||||
|
|
||||||
|
INCLUDE := $(foreach dir,$(LIBDIRS),-I$(dir)/include)
|
||||||
|
|
||||||
|
ARCH := -mcpu=mpcore -mfloat-abi=hard
|
||||||
|
ASFLAGS := -g $(ARCH)
|
||||||
|
CFLAGS := -Wall -Wextra -MMD -MP -marm $(ASFLAGS) -mtp=soft -fno-builtin -std=c11 -O2 -flto -ffast-math -mword-relocations \
|
||||||
|
-fomit-frame-pointer -ffunction-sections -fdata-sections $(INCLUDE) -I$(dir_include) -DARM11 -D_3DS
|
||||||
|
LDFLAGS := -specs=3dsx.specs -g $(ARCH) -mtp=soft -Wl,--section-start,.text=0x14000000 -Wl,--gc-sections
|
||||||
|
|
||||||
|
objects = $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \
|
||||||
|
$(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \
|
||||||
|
$(call rwildcard, $(dir_source), *.s *.c)))
|
||||||
|
|
||||||
|
xml_files = $(call rwildcard, $(dir_source), *.xml)
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: $(dir_out)/$(name).cxi
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
@$(MAKE) -C $(dir_kernel_extension) clean
|
||||||
|
@rm -rf $(dir_build)
|
||||||
|
|
||||||
|
.PHONY: $(dir_kernel_extension)
|
||||||
|
|
||||||
|
$(dir_out)/$(name).cxi: $(dir_build)/$(name).elf
|
||||||
|
@makerom -f ncch -rsf rosalina.rsf -nocodepadding -o $@ -elf $<
|
||||||
|
|
||||||
|
$(dir_build)/$(name).elf: $(objects)
|
||||||
|
$(LINK.o) $(OUTPUT_OPTION) $^ $(LIBPATHS) $(LIBS)
|
||||||
|
|
||||||
|
$(dir_build)/kernel_extension.bin: $(dir_kernel_extension)
|
||||||
|
@mkdir -p "$(@D)"
|
||||||
|
@$(MAKE) -C $<
|
||||||
|
|
||||||
|
$(dir_build)/xml_data.h: $(xml_files)
|
||||||
|
@ echo "" > $(@)
|
||||||
|
@$(foreach f, $(xml_files),\
|
||||||
|
echo "static const char" `(echo $(notdir $(f)) | sed -e 's/^\([0-9]\)/_\1/g' | tr . _)`"[] = " >> $(@);\
|
||||||
|
sed -e 's/\\/\\\\/g;s/"/\\"/g;s/^/"/g;s/[ \t\r\n]*$$/\\n"/g' $(f) >> $(@);\
|
||||||
|
echo ';' >> $@;\
|
||||||
|
)
|
||||||
|
$(dir_build)/gdb/xfer.o: $(dir_build)/xml_data.h
|
||||||
|
$(dir_build)/memory.o : CFLAGS += -O3
|
||||||
|
$(dir_build)/kernel_extension.o: $(dir_build)/kernel_extension.bin
|
||||||
|
|
||||||
|
$(dir_build)/%.o: $(dir_source)/%.c
|
||||||
|
@mkdir -p "$(@D)"
|
||||||
|
$(COMPILE.c) $(OUTPUT_OPTION) $<
|
||||||
|
|
||||||
|
$(dir_build)/%.o: $(dir_source)/%.s
|
||||||
|
@mkdir -p "$(@D)"
|
||||||
|
$(COMPILE.s) $(OUTPUT_OPTION) $<
|
||||||
|
include $(call rwildcard, $(dir_build), *.d)
|
111
sysmodules/rosalina/include/3dsx.h
Normal file
111
sysmodules/rosalina/include/3dsx.h
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* File entirely written by fincs */
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <3ds/types.h>
|
||||||
|
#include "ifile.h"
|
||||||
|
|
||||||
|
// File layout:
|
||||||
|
// - File header
|
||||||
|
// - Code, rodata and data relocation table headers
|
||||||
|
// - Code segment
|
||||||
|
// - Rodata segment
|
||||||
|
// - Loadable (non-BSS) part of the data segment
|
||||||
|
// - Code relocation table
|
||||||
|
// - Rodata relocation table
|
||||||
|
// - Data relocation table
|
||||||
|
|
||||||
|
// Memory layout before relocations are applied:
|
||||||
|
// [0..codeSegSize) -> code segment
|
||||||
|
// [codeSegSize..rodataSegSize) -> rodata segment
|
||||||
|
// [rodataSegSize..dataSegSize) -> data segment
|
||||||
|
|
||||||
|
// Memory layout after relocations are applied: well, however the loader sets it up :)
|
||||||
|
// The entrypoint is always the start of the code segment.
|
||||||
|
// The BSS section must be cleared manually by the application.
|
||||||
|
|
||||||
|
// File header
|
||||||
|
#define _3DSX_MAGIC 0x58534433 // '3DSX'
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u32 magic;
|
||||||
|
u16 headerSize, relocHdrSize;
|
||||||
|
u32 formatVer;
|
||||||
|
u32 flags;
|
||||||
|
|
||||||
|
// Sizes of the code, rodata and data segments +
|
||||||
|
// size of the BSS section (uninitialized latter half of the data segment)
|
||||||
|
u32 codeSegSize, rodataSegSize, dataSegSize, bssSize;
|
||||||
|
} _3DSX_Header;
|
||||||
|
|
||||||
|
// Relocation header: all fields (even extra unknown fields) are guaranteed to be relocation counts.
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u32 cAbsolute; // # of absolute relocations (that is, fix address to post-relocation memory layout)
|
||||||
|
u32 cRelative; // # of cross-segment relative relocations (that is, 32bit signed offsets that need to be patched)
|
||||||
|
// more?
|
||||||
|
|
||||||
|
// Relocations are written in this order:
|
||||||
|
// - Absolute relocs
|
||||||
|
// - Relative relocs
|
||||||
|
} _3DSX_RelocHdr;
|
||||||
|
|
||||||
|
// Relocation entry: from the current pointer, skip X words and patch Y words
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u16 skip, patch;
|
||||||
|
} _3DSX_Reloc;
|
||||||
|
|
||||||
|
// _prm structure
|
||||||
|
#define _PRM_MAGIC 0x6D72705F // '_prm'
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u32 magic;
|
||||||
|
u32 pSrvOverride;
|
||||||
|
u32 aptAppId;
|
||||||
|
u32 heapSize, linearHeapSize;
|
||||||
|
u32 pArgList;
|
||||||
|
u32 runFlags;
|
||||||
|
} PrmStruct;
|
||||||
|
|
||||||
|
// Service override structure
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u32 count;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
char name[8];
|
||||||
|
Handle handle;
|
||||||
|
} services[];
|
||||||
|
} SrvOverride;
|
||||||
|
|
||||||
|
#define ARGVBUF_SIZE 0x400
|
||||||
|
extern u32 ldrArgvBuf[ARGVBUF_SIZE/4];
|
||||||
|
|
||||||
|
bool Ldr_Get3dsxSize(u32* pSize, IFile *file);
|
||||||
|
Handle Ldr_CodesetFrom3dsx(const char* name, u32* codePages, u32 baseAddr, IFile *file, u64 tid);
|
46
sysmodules/rosalina/include/MyThread.h
Normal file
46
sysmodules/rosalina/include/MyThread.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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 <3ds/types.h>
|
||||||
|
#include <3ds/result.h>
|
||||||
|
#include <3ds/svc.h>
|
||||||
|
#include <3ds/synchronization.h>
|
||||||
|
|
||||||
|
#define THREAD_STACK_SIZE 0x1000
|
||||||
|
|
||||||
|
typedef struct MyThread
|
||||||
|
{
|
||||||
|
Handle handle;
|
||||||
|
void (*ep)(void);
|
||||||
|
bool finished;
|
||||||
|
void* stacktop;
|
||||||
|
} MyThread;
|
||||||
|
|
||||||
|
Result MyThread_Create(MyThread *t, void (*entrypoint)(void), void *stack, u32 stackSize, int prio, int affinity);
|
||||||
|
Result MyThread_Join(MyThread *thread, s64 timeout_ns);
|
||||||
|
void MyThread_Exit(void);
|
137
sysmodules/rosalina/include/csvc.h
Normal file
137
sysmodules/rosalina/include/csvc.h
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
/* This paricular file is licensed under the following terms: */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable
|
||||||
|
* for any damages arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it
|
||||||
|
* and redistribute it freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* The origin of this software must not be misrepresented; you must not claim that you wrote the original software.
|
||||||
|
* If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
|
||||||
|
*
|
||||||
|
* Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
|
||||||
|
* This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <3ds/types.h>
|
||||||
|
|
||||||
|
/// Operations for svcControlService
|
||||||
|
typedef enum ServiceOp
|
||||||
|
{
|
||||||
|
SERVICEOP_STEAL_CLIENT_SESSION = 0, ///< Steal a client session given a service or global port name
|
||||||
|
SERVICEOP_GET_NAME, ///< Get the name of a service or global port given a client or session handle
|
||||||
|
} ServiceOp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Executes a function in supervisor mode, using the supervisor-mode stack.
|
||||||
|
* @param func Function to execute.
|
||||||
|
* @param ... Function parameters, up to 3 registers.
|
||||||
|
*/
|
||||||
|
Result svcCustomBackdoor(void *func, ...);
|
||||||
|
|
||||||
|
///@name I/O
|
||||||
|
///@{
|
||||||
|
/**
|
||||||
|
* @brief Gives the physical address corresponding to a virtual address.
|
||||||
|
* @param VA Virtual address.
|
||||||
|
* @param writeCheck whether to check if the VA is writable in supervisor mode
|
||||||
|
* @return The corresponding physical address, or NULL.
|
||||||
|
*/
|
||||||
|
u32 svcConvertVAToPA(const void *VA, bool writeCheck);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Flushes a range of the data cache (L2C included).
|
||||||
|
* @param addr Start address.
|
||||||
|
* @param len Length of the range.
|
||||||
|
*/
|
||||||
|
void svcFlushDataCacheRange(void *addr, u32 len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Flushes the data cache entirely (L2C included).
|
||||||
|
*/
|
||||||
|
void svcFlushEntireDataCache(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Invalidates a range of the instruction cache.
|
||||||
|
* @param addr Start address.
|
||||||
|
* @param len Length of the range.
|
||||||
|
*/
|
||||||
|
void svcInvalidateInstructionCacheRange(void *addr, u32 len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Invalidates the data cache entirely.
|
||||||
|
*/
|
||||||
|
void svcInvalidateEntireInstructionCache(void);
|
||||||
|
///@}
|
||||||
|
|
||||||
|
///@name Memory management
|
||||||
|
///@{
|
||||||
|
/**
|
||||||
|
* @brief Maps a block of process memory.
|
||||||
|
* @param process Handle of the process.
|
||||||
|
* @param destAddress Address of the mapped block in the current process.
|
||||||
|
* @param srcAddress Address of the mapped block in the source process.
|
||||||
|
* @param size Size of the block of the memory to map (truncated to a multiple of 0x1000 bytes).
|
||||||
|
*/
|
||||||
|
Result svcMapProcessMemoryEx(Handle process, u32 destAddr, u32 srcAddr, u32 size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Unmaps a block of process memory.
|
||||||
|
* @param process Handle of the process.
|
||||||
|
* @param destAddress Address of the block of memory to unmap, in the current (destination) process.
|
||||||
|
* @param size Size of the block of memory to unmap (truncated to a multiple of 0x1000 bytes).
|
||||||
|
*/
|
||||||
|
Result svcUnmapProcessMemoryEx(Handle process, u32 destAddress, u32 size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Controls memory mapping, with the choice to use region attributes or not.
|
||||||
|
* @param[out] addr_out The virtual address resulting from the operation. Usually the same as addr0.
|
||||||
|
* @param addr0 The virtual address to be used for the operation.
|
||||||
|
* @param addr1 The virtual address to be (un)mirrored by @p addr0 when using @ref MEMOP_MAP or @ref MEMOP_UNMAP.
|
||||||
|
* It has to be pointing to a RW memory.
|
||||||
|
* Use NULL if the operation is @ref MEMOP_FREE or @ref MEMOP_ALLOC.
|
||||||
|
* @param size The requested size for @ref MEMOP_ALLOC and @ref MEMOP_ALLOC_LINEAR.
|
||||||
|
* @param op Operation flags. See @ref MemOp.
|
||||||
|
* @param perm A combination of @ref MEMPERM_READ and @ref MEMPERM_WRITE. Using MEMPERM_EXECUTE will return an error.
|
||||||
|
* Value 0 is used when unmapping memory.
|
||||||
|
* @param isLoader Whether to use the region attributes
|
||||||
|
* If a memory is mapped for two or more addresses, you have to use MEMOP_UNMAP before being able to MEMOP_FREE it.
|
||||||
|
* MEMOP_MAP will fail if @p addr1 was already mapped to another address.
|
||||||
|
*
|
||||||
|
* @sa svcControlMemory
|
||||||
|
*/
|
||||||
|
Result svcControlMemoryEx(u32* addr_out, u32 addr0, u32 addr1, u32 size, MemOp op, MemPerm perm, bool isLoader);
|
||||||
|
///@}
|
||||||
|
|
||||||
|
///@name System
|
||||||
|
///@{
|
||||||
|
/**
|
||||||
|
* @brief Performs actions related to services or global handles.
|
||||||
|
* @param op The operation to perform, see @ref ServiceOp.
|
||||||
|
*
|
||||||
|
* Examples:
|
||||||
|
* svcControlService(SERVICEOP_GET_NAME, (char [12])outName, (Handle)clientOrSessionHandle);
|
||||||
|
* svcControlService(SERVICEOP_STEAL_CLIENT_SESSION, (Handle *)&outHandle, (const char *)name);
|
||||||
|
*/
|
||||||
|
Result svcControlService(ServiceOp op, ...);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copy a handle from a process to another one.
|
||||||
|
* @param[out] out The output handle.
|
||||||
|
* @param outProcess Handle of the process of the output handle.
|
||||||
|
* @param in The input handle. Pseudo-handles are not accepted.
|
||||||
|
* @param inProcess Handle of the process of the input handle.
|
||||||
|
*/
|
||||||
|
Result svcCopyHandle(Handle *out, Handle outProcess, Handle in, Handle inProcess);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the address and class name of the underlying kernel object corresponding to a handle.
|
||||||
|
* @param[out] outKAddr The output kernel address.
|
||||||
|
* @param[out] outName Output class name. The buffer should be large enough to contain it.
|
||||||
|
* @param in The input handle.
|
||||||
|
*/
|
||||||
|
Result svcTranslateHandle(u32 *outKAddr, char *outClassName, Handle in);
|
||||||
|
///@}
|
85
sysmodules/rosalina/include/draw.h
Normal file
85
sysmodules/rosalina/include/draw.h
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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 <3ds/types.h>
|
||||||
|
#include <3ds/gfx.h>
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
#define GPU_FB_TOP_LEFT_ADDR_1 REG32(0x10400468)
|
||||||
|
#define GPU_FB_TOP_LEFT_ADDR_2 REG32(0x1040046C)
|
||||||
|
#define GPU_FB_TOP_FMT REG32(0x10400470)
|
||||||
|
#define GPU_FB_TOP_SEL REG32(0x10400478)
|
||||||
|
#define GPU_FB_TOP_STRIDE REG32(0x10400490)
|
||||||
|
#define GPU_FB_TOP_RIGHT_ADDR_1 REG32(0x10400494)
|
||||||
|
#define GPU_FB_TOP_RIGHT_ADDR_2 REG32(0x10400498)
|
||||||
|
|
||||||
|
#define GPU_FB_BOTTOM_ADDR_1 REG32(0x10400568)
|
||||||
|
#define GPU_FB_BOTTOM_ADDR_2 REG32(0x1040056C)
|
||||||
|
#define GPU_FB_BOTTOM_FMT REG32(0x10400570)
|
||||||
|
#define GPU_FB_BOTTOM_SEL REG32(0x10400578)
|
||||||
|
#define GPU_FB_BOTTOM_STRIDE REG32(0x10400590)
|
||||||
|
|
||||||
|
#define GPU_PSC0_CNT REG32(0x1040001C)
|
||||||
|
#define GPU_PSC1_CNT REG32(0x1040001C)
|
||||||
|
|
||||||
|
#define GPU_TRANSFER_CNT REG32(0x10400C18)
|
||||||
|
#define GPU_CMDLIST_CNT REG32(0x104018F0)
|
||||||
|
|
||||||
|
#define FB_BOTTOM_VRAM_ADDR ((void *)0x1F48F000) // cached
|
||||||
|
#define FB_BOTTOM_VRAM_PA 0x1848F000
|
||||||
|
#define FB_BOTTOM_SIZE (320 * 240 * 2)
|
||||||
|
|
||||||
|
#define SCREEN_BOT_WIDTH 320
|
||||||
|
#define SCREEN_BOT_HEIGHT 240
|
||||||
|
|
||||||
|
#define SPACING_Y 11
|
||||||
|
#define SPACING_X 6
|
||||||
|
|
||||||
|
#define COLOR_TITLE RGB565(0x00, 0x26, 0x1F)
|
||||||
|
#define COLOR_WHITE RGB565(0x1F, 0x3F, 0x1F)
|
||||||
|
#define COLOR_RED RGB565(0x1F, 0x00, 0x00)
|
||||||
|
#define COLOR_BLACK RGB565(0x00, 0x00, 0x00)
|
||||||
|
|
||||||
|
#define DRAW_MAX_FORMATTED_STRING_SIZE 512
|
||||||
|
|
||||||
|
void Draw_Lock(void);
|
||||||
|
void Draw_Unlock(void);
|
||||||
|
|
||||||
|
void Draw_DrawCharacter(u32 posX, u32 posY, u32 color, char character);
|
||||||
|
u32 Draw_DrawString(u32 posX, u32 posY, u32 color, const char *string);
|
||||||
|
u32 Draw_DrawFormattedString(u32 posX, u32 posY, u32 color, const char *fmt, ...);
|
||||||
|
|
||||||
|
void Draw_FillFramebuffer(u32 value);
|
||||||
|
void Draw_ClearFramebuffer(void);
|
||||||
|
void Draw_SetupFramebuffer(void);
|
||||||
|
void Draw_RestoreFramebuffer(void);
|
||||||
|
void Draw_FlushFramebuffer(void);
|
||||||
|
u32 Draw_GetCurrentFramebufferAddress(bool top, bool left);
|
||||||
|
|
||||||
|
void Draw_CreateBitmapHeader(u8 *dst, u32 width, u32 heigth);
|
||||||
|
u8 *Draw_ConvertFrameBufferLine(bool top, bool left, u32 y);
|
34
sysmodules/rosalina/include/errdisp.h
Normal file
34
sysmodules/rosalina/include/errdisp.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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 <3ds/types.h>
|
||||||
|
#include "MyThread.h"
|
||||||
|
|
||||||
|
MyThread *errDispCreateThread(void);
|
||||||
|
|
||||||
|
void errDispThreadMain(void);
|
127
sysmodules/rosalina/include/exheader.h
Normal file
127
sysmodules/rosalina/include/exheader.h
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* File written by fincs */
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <3ds/types.h>
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 reserved[5];
|
||||||
|
u8 flag;
|
||||||
|
u8 remasterversion[2];
|
||||||
|
} PACKED exheader_systeminfoflags;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u32 address;
|
||||||
|
u32 nummaxpages;
|
||||||
|
u32 codesize;
|
||||||
|
} PACKED exheader_codesegmentinfo;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 name[8];
|
||||||
|
exheader_systeminfoflags flags;
|
||||||
|
exheader_codesegmentinfo text;
|
||||||
|
u8 stacksize[4];
|
||||||
|
exheader_codesegmentinfo ro;
|
||||||
|
u8 reserved[4];
|
||||||
|
exheader_codesegmentinfo data;
|
||||||
|
u32 bsssize;
|
||||||
|
} PACKED exheader_codesetinfo;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u64 programid[0x30];
|
||||||
|
} PACKED exheader_dependencylist;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 savedatasize[4];
|
||||||
|
u8 reserved[4];
|
||||||
|
u8 jumpid[8];
|
||||||
|
u8 reserved2[0x30];
|
||||||
|
} PACKED exheader_systeminfo;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 extsavedataid[8];
|
||||||
|
u8 systemsavedataid[8];
|
||||||
|
u8 reserved[8];
|
||||||
|
u8 accessinfo[7];
|
||||||
|
u8 otherattributes;
|
||||||
|
} PACKED exheader_storageinfo;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u64 programid;
|
||||||
|
u32 firm;
|
||||||
|
u8 flags[3];
|
||||||
|
u8 priority;
|
||||||
|
u16 resourcelimitdescriptor[0x10];
|
||||||
|
exheader_storageinfo storageinfo;
|
||||||
|
u64 serviceaccesscontrol[0x20];
|
||||||
|
u8 reserved[0x1f];
|
||||||
|
u8 resourcelimitcategory;
|
||||||
|
} PACKED exheader_arm11systemlocalcaps;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u32 descriptors[28];
|
||||||
|
u8 reserved[0x10];
|
||||||
|
} PACKED exheader_arm11kernelcapabilities;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 descriptors[15];
|
||||||
|
u8 descversion;
|
||||||
|
} PACKED exheader_arm9accesscontrol;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
// systemcontrol info {
|
||||||
|
// coreinfo {
|
||||||
|
exheader_codesetinfo codesetinfo;
|
||||||
|
exheader_dependencylist deplist;
|
||||||
|
// }
|
||||||
|
exheader_systeminfo systeminfo;
|
||||||
|
// }
|
||||||
|
// accesscontrolinfo {
|
||||||
|
exheader_arm11systemlocalcaps arm11systemlocalcaps;
|
||||||
|
exheader_arm11kernelcapabilities arm11kernelcaps;
|
||||||
|
exheader_arm9accesscontrol arm9accesscontrol;
|
||||||
|
// }
|
||||||
|
struct {
|
||||||
|
u8 signature[0x100];
|
||||||
|
u8 ncchpubkeymodulus[0x100];
|
||||||
|
exheader_arm11systemlocalcaps arm11systemlocalcaps;
|
||||||
|
exheader_arm11kernelcapabilities arm11kernelcaps;
|
||||||
|
exheader_arm9accesscontrol arm9accesscontrol;
|
||||||
|
} PACKED accessdesc;
|
||||||
|
} PACKED exheader_header;
|
32
sysmodules/rosalina/include/fmt.h
Normal file
32
sysmodules/rosalina/include/fmt.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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 "memory.h"
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
int vsprintf(char *buf, const char *fmt, va_list args);
|
||||||
|
int sprintf(char *buf, const char *fmt, ...);
|
3083
sysmodules/rosalina/include/font.h
Normal file
3083
sysmodules/rosalina/include/font.h
Normal file
File diff suppressed because it is too large
Load Diff
41
sysmodules/rosalina/include/fsreg.h
Normal file
41
sysmodules/rosalina/include/fsreg.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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 <3ds/types.h>
|
||||||
|
#include "exheader.h"
|
||||||
|
|
||||||
|
Result fsregInit(void);
|
||||||
|
void fsregExit(void);
|
||||||
|
Result FSREG_CheckHostLoadId(u64 prog_handle);
|
||||||
|
Result FSREG_LoadProgram(u64 *prog_handle, FS_ProgramInfo *title);
|
||||||
|
Result FSREG_GetProgramInfo(exheader_header *exheader, u32 entry_count, u64 prog_handle);
|
||||||
|
Result FSREG_UnloadProgram(u64 prog_handle);
|
||||||
|
Result FSREG_Unregister(u32 pid);
|
||||||
|
Result FSREG_Register(u32 pid, u64 prog_handle, FS_ProgramInfo *info, void *storageinfo);
|
||||||
|
Result fsregSetupPermissions(void);
|
||||||
|
Handle fsregGetHandle(void);
|
130
sysmodules/rosalina/include/gdb.h
Normal file
130
sysmodules/rosalina/include/gdb.h
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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 <3ds/types.h>
|
||||||
|
#include <3ds/svc.h>
|
||||||
|
#include <3ds/synchronization.h>
|
||||||
|
#include <3ds/result.h>
|
||||||
|
#include "sock_util.h"
|
||||||
|
#include "memory.h"
|
||||||
|
|
||||||
|
#define MAX_DEBUG 3
|
||||||
|
#define MAX_DEBUG_THREAD 127
|
||||||
|
#define MAX_BREAKPOINT 256
|
||||||
|
// 512+24 is the ideal size as IDA will try to read exactly 0x100 bytes at a time. Add 4 to this, for $#<checksum>, see below.
|
||||||
|
// IDA seems to want additional bytes as well.
|
||||||
|
// 1024 is fine enough to put all regs in the 'T' stop reply packets
|
||||||
|
#define GDB_BUF_LEN 1024
|
||||||
|
|
||||||
|
#define GDB_HANDLER(name) GDB_Handle##name
|
||||||
|
#define GDB_QUERY_HANDLER(name) GDB_HANDLER(Query##name)
|
||||||
|
#define GDB_VERBOSE_HANDLER(name) GDB_HANDLER(Verbose##name)
|
||||||
|
|
||||||
|
#define GDB_DECLARE_HANDLER(name) int GDB_HANDLER(name)(GDBContext *ctx)
|
||||||
|
#define GDB_DECLARE_QUERY_HANDLER(name) GDB_DECLARE_HANDLER(Query##name)
|
||||||
|
#define GDB_DECLARE_VERBOSE_HANDLER(name) GDB_DECLARE_HANDLER(Verbose##name)
|
||||||
|
|
||||||
|
typedef struct Breakpoint
|
||||||
|
{
|
||||||
|
u32 address;
|
||||||
|
u32 savedInstruction;
|
||||||
|
u8 instructionSize;
|
||||||
|
bool persistent;
|
||||||
|
} Breakpoint;
|
||||||
|
|
||||||
|
typedef enum GDBFlags
|
||||||
|
{
|
||||||
|
GDB_FLAG_SELECTED = 1,
|
||||||
|
GDB_FLAG_USED = 2,
|
||||||
|
GDB_FLAG_PROCESS_CONTINUING = 4,
|
||||||
|
GDB_FLAG_TERMINATE_PROCESS = 8,
|
||||||
|
} GDBFlags;
|
||||||
|
|
||||||
|
typedef enum GDBState
|
||||||
|
{
|
||||||
|
GDB_STATE_DISCONNECTED,
|
||||||
|
GDB_STATE_CONNECTED,
|
||||||
|
GDB_STATE_NOACK_SENT,
|
||||||
|
GDB_STATE_NOACK,
|
||||||
|
GDB_STATE_CLOSING
|
||||||
|
} GDBState;
|
||||||
|
|
||||||
|
typedef struct ThreadInfo
|
||||||
|
{
|
||||||
|
u32 id;
|
||||||
|
u32 tls;
|
||||||
|
} ThreadInfo;
|
||||||
|
|
||||||
|
typedef struct GDBContext
|
||||||
|
{
|
||||||
|
sock_ctx super;
|
||||||
|
|
||||||
|
RecursiveLock lock;
|
||||||
|
GDBFlags flags;
|
||||||
|
GDBState state;
|
||||||
|
|
||||||
|
u32 pid;
|
||||||
|
Handle debug;
|
||||||
|
ThreadInfo threadInfos[MAX_DEBUG_THREAD];
|
||||||
|
u32 nbThreads;
|
||||||
|
|
||||||
|
u32 currentThreadId, selectedThreadId, selectedThreadIdForContinuing;
|
||||||
|
|
||||||
|
Handle clientAcceptedEvent, continuedEvent;
|
||||||
|
Handle eventToWaitFor;
|
||||||
|
|
||||||
|
bool catchThreadEvents;
|
||||||
|
bool processEnded, processExited;
|
||||||
|
|
||||||
|
DebugEventInfo latestDebugEvent;
|
||||||
|
DebugFlags continueFlags;
|
||||||
|
u32 svcMask[8];
|
||||||
|
|
||||||
|
u32 nbBreakpoints;
|
||||||
|
Breakpoint breakpoints[MAX_BREAKPOINT];
|
||||||
|
|
||||||
|
u32 nbWatchpoints;
|
||||||
|
u32 watchpoints[2];
|
||||||
|
|
||||||
|
bool isGDB;
|
||||||
|
char *commandData, *commandEnd;
|
||||||
|
int latestSentPacketSize;
|
||||||
|
char buffer[GDB_BUF_LEN + 4];
|
||||||
|
|
||||||
|
char threadListData[0x800];
|
||||||
|
u32 threadListDataPos;
|
||||||
|
|
||||||
|
char memoryOsInfoXmlData[0x800];
|
||||||
|
char processesOsInfoXmlData[0x2000];
|
||||||
|
} GDBContext;
|
||||||
|
|
||||||
|
typedef int (*GDBCommandHandler)(GDBContext *ctx);
|
||||||
|
|
||||||
|
void GDB_InitializeContext(GDBContext *ctx);
|
||||||
|
void GDB_FinalizeContext(GDBContext *ctx);
|
||||||
|
GDB_DECLARE_HANDLER(Unsupported);
|
39
sysmodules/rosalina/include/gdb/breakpoints.h
Normal file
39
sysmodules/rosalina/include/gdb/breakpoints.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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 "gdb.h"
|
||||||
|
|
||||||
|
// We'll actually use SVC 0xFF for breakpoints :P
|
||||||
|
#define BREAKPOINT_INSTRUCTION_ARM 0xEF0000FF
|
||||||
|
#define BREAKPOINT_INSTRUCTION_THUMB 0xDFFF
|
||||||
|
|
||||||
|
u32 GDB_FindClosestBreakpointSlot(GDBContext *ctx, u32 address);
|
||||||
|
int GDB_GetBreakpointInstruction(u32 *instr, GDBContext *ctx, u32 address);
|
||||||
|
int GDB_AddBreakpoint(GDBContext *ctx, u32 address, bool thumb, bool persist);
|
||||||
|
int GDB_DisableBreakpointById(GDBContext *ctx, u32 id);
|
||||||
|
int GDB_RemoveBreakpoint(GDBContext *ctx, u32 address);
|
41
sysmodules/rosalina/include/gdb/debug.h
Normal file
41
sysmodules/rosalina/include/gdb/debug.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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 "gdb.h"
|
||||||
|
|
||||||
|
GDB_DECLARE_HANDLER(Detach);
|
||||||
|
GDB_DECLARE_HANDLER(Kill);
|
||||||
|
GDB_DECLARE_HANDLER(Break);
|
||||||
|
GDB_DECLARE_HANDLER(Continue);
|
||||||
|
GDB_DECLARE_VERBOSE_HANDLER(Continue);
|
||||||
|
GDB_DECLARE_HANDLER(GetStopReason);
|
||||||
|
|
||||||
|
void GDB_PreprocessDebugEvent(GDBContext *ctx, DebugEventInfo *info);
|
||||||
|
int GDB_SendStopReply(GDBContext *ctx, const DebugEventInfo *info);
|
||||||
|
int GDB_HandleDebugEvents(GDBContext *ctx);
|
||||||
|
void GDB_BreakProcessAndSinkDebugEvents(GDBContext *ctx, DebugFlags flags);
|
40
sysmodules/rosalina/include/gdb/mem.h
Normal file
40
sysmodules/rosalina/include/gdb/mem.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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 "gdb.h"
|
||||||
|
|
||||||
|
Result GDB_ReadMemoryInPage(void *out, GDBContext *ctx, u32 addr, u32 len);
|
||||||
|
Result GDB_WriteMemoryInPage(GDBContext *ctx, const void *in, u32 addr, u32 len);
|
||||||
|
int GDB_SendMemory(GDBContext *ctx, const char *prefix, u32 prefixLen, u32 addr, u32 len);
|
||||||
|
int GDB_WriteMemory(GDBContext *ctx, const void *buf, u32 addr, u32 len);
|
||||||
|
u32 GDB_SearchMemory(bool *found, GDBContext *ctx, u32 addr, u32 len, const void *pattern, u32 patternLen);
|
||||||
|
|
||||||
|
GDB_DECLARE_HANDLER(ReadMemory);
|
||||||
|
GDB_DECLARE_HANDLER(WriteMemory);
|
||||||
|
GDB_DECLARE_HANDLER(WriteMemoryRaw);
|
||||||
|
GDB_DECLARE_QUERY_HANDLER(SearchMemory);
|
32
sysmodules/rosalina/include/gdb/monitor.h
Normal file
32
sysmodules/rosalina/include/gdb/monitor.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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 "gdb.h"
|
||||||
|
#include "gdb/server.h"
|
||||||
|
|
||||||
|
void GDB_RunMonitor(GDBServer *server);
|
47
sysmodules/rosalina/include/gdb/net.h
Normal file
47
sysmodules/rosalina/include/gdb/net.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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 "gdb.h"
|
||||||
|
#define _REENT_ONLY
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
u8 GDB_ComputeChecksum(const char *packetData, u32 len);
|
||||||
|
void GDB_EncodeHex(char *dst, const void *src, u32 len);
|
||||||
|
u32 GDB_DecodeHex(void *dst, const char *src, u32 len);
|
||||||
|
u32 GDB_UnescapeBinaryData(void *dst, const void *src, u32 len);
|
||||||
|
const char *GDB_ParseIntegerList(u32 *dst, const char *src, u32 nb, char sep, char lastSep, u32 base, bool allowPrefix);
|
||||||
|
const char *GDB_ParseHexIntegerList(u32 *dst, const char *src, u32 nb, char lastSep);
|
||||||
|
int GDB_ReceivePacket(GDBContext *ctx);
|
||||||
|
int GDB_SendPacket(GDBContext *ctx, const char *packetData, u32 len);
|
||||||
|
int GDB_SendFormattedPacket(GDBContext *ctx, const char *packetDataFmt, ...);
|
||||||
|
int GDB_SendHexPacket(GDBContext *ctx, const void *packetData, u32 len);
|
||||||
|
int GDB_SendStreamData(GDBContext *ctx, const char *streamData, u32 offset, u32 length, u32 totalSize, bool forceEmptyLast);
|
||||||
|
int GDB_SendDebugString(GDBContext *ctx, const char *fmt, ...); // unsecure
|
||||||
|
int GDB_ReplyEmpty(GDBContext *ctx);
|
||||||
|
int GDB_ReplyOk(GDBContext *ctx);
|
||||||
|
int GDB_ReplyErrno(GDBContext *ctx, int no);
|
37
sysmodules/rosalina/include/gdb/query.h
Normal file
37
sysmodules/rosalina/include/gdb/query.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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 "gdb.h"
|
||||||
|
|
||||||
|
int GDB_HandleReadQuery(GDBContext *ctx);
|
||||||
|
int GDB_HandleWriteQuery(GDBContext *ctx);
|
||||||
|
|
||||||
|
GDB_DECLARE_QUERY_HANDLER(Supported);
|
||||||
|
GDB_DECLARE_QUERY_HANDLER(StartNoAckMode);
|
||||||
|
GDB_DECLARE_QUERY_HANDLER(Attached);
|
||||||
|
GDB_DECLARE_QUERY_HANDLER(CatchSyscalls);
|
34
sysmodules/rosalina/include/gdb/regs.h
Normal file
34
sysmodules/rosalina/include/gdb/regs.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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 "gdb.h"
|
||||||
|
|
||||||
|
GDB_DECLARE_HANDLER(ReadRegisters);
|
||||||
|
GDB_DECLARE_HANDLER(WriteRegisters);
|
||||||
|
GDB_DECLARE_HANDLER(ReadRegister);
|
||||||
|
GDB_DECLARE_HANDLER(WriteRegister);
|
39
sysmodules/rosalina/include/gdb/remote_command.h
Normal file
39
sysmodules/rosalina/include/gdb/remote_command.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 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 "gdb.h"
|
||||||
|
|
||||||
|
#define GDB_REMOTE_COMMAND_HANDLER(name) GDB_HANDLER(RemoteCommand##name)
|
||||||
|
#define GDB_DECLARE_REMOTE_COMMAND_HANDLER(name) GDB_DECLARE_HANDLER(RemoteCommand##name)
|
||||||
|
|
||||||
|
GDB_DECLARE_REMOTE_COMMAND_HANDLER(SyncRequestInfo);
|
||||||
|
GDB_DECLARE_REMOTE_COMMAND_HANDLER(TranslateHandle);
|
||||||
|
GDB_DECLARE_REMOTE_COMMAND_HANDLER(GetMmuConfig);
|
||||||
|
GDB_DECLARE_REMOTE_COMMAND_HANDLER(FlushCaches);
|
||||||
|
|
||||||
|
GDB_DECLARE_QUERY_HANDLER(Rcmd);
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user