-
Notifications
You must be signed in to change notification settings - Fork 20
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
aa137dd
commit 365817d
Showing
5 changed files
with
143 additions
and
68 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
#include <string.h> | ||
#include <stdio.h> | ||
#include <stdbool.h> | ||
|
||
#include <switch.h> | ||
#include "reboot.h" | ||
|
||
#define IRAM_PAYLOAD_MAX_SIZE 0x2F000 | ||
#define IRAM_PAYLOAD_BASE 0x40010000 | ||
|
||
static alignas(0x1000) u8 g_reboot_payload[IRAM_PAYLOAD_MAX_SIZE]; | ||
static alignas(0x1000) u8 g_ff_page[0x1000]; | ||
static alignas(0x1000) u8 g_work_page[0x1000]; | ||
|
||
void do_iram_dram_copy(void *buf, uintptr_t iram_addr, size_t size, int option) { | ||
memcpy(g_work_page, buf, size); | ||
|
||
SecmonArgs args = {0}; | ||
args.X[0] = 0xF0000201; /* smcAmsIramCopy */ | ||
args.X[1] = (uintptr_t)g_work_page; /* DRAM Address */ | ||
args.X[2] = iram_addr; /* IRAM Address */ | ||
args.X[3] = size; /* Copy size */ | ||
args.X[4] = option; /* 0 = Read, 1 = Write */ | ||
svcCallSecureMonitor(&args); | ||
|
||
memcpy(buf, g_work_page, size); | ||
} | ||
|
||
void copy_to_iram(uintptr_t iram_addr, void *buf, size_t size) { | ||
do_iram_dram_copy(buf, iram_addr, size, 1); | ||
} | ||
|
||
void copy_from_iram(void *buf, uintptr_t iram_addr, size_t size) { | ||
do_iram_dram_copy(buf, iram_addr, size, 0); | ||
} | ||
|
||
static void clear_iram(void) { | ||
memset(g_ff_page, 0xFF, sizeof(g_ff_page)); | ||
for (size_t i = 0; i < IRAM_PAYLOAD_MAX_SIZE; i += sizeof(g_ff_page)) { | ||
copy_to_iram(IRAM_PAYLOAD_BASE + i, g_ff_page, sizeof(g_ff_page)); | ||
} | ||
} | ||
|
||
void reboot_to_payload(void) { | ||
clear_iram(); | ||
|
||
for (size_t i = 0; i < IRAM_PAYLOAD_MAX_SIZE; i += 0x1000) { | ||
copy_to_iram(IRAM_PAYLOAD_BASE + i, &g_reboot_payload[i], 0x1000); | ||
} | ||
|
||
splSetConfig((SplConfigItem)65001, 2); | ||
} | ||
|
||
bool init_slp() | ||
{ | ||
bool can_reboot = true; | ||
Result rc = splInitialize(); | ||
if (R_FAILED(rc)) { | ||
can_reboot = false; | ||
} else { | ||
FILE *f = fopen("romfs:/TegraExplorer.bin", "rb"); | ||
if (f == NULL) { | ||
can_reboot = false; | ||
} else { | ||
fread(g_reboot_payload, 1, sizeof(g_reboot_payload), f); | ||
fclose(f); | ||
} | ||
} | ||
return can_reboot; | ||
} | ||
|
||
void exit_spl(bool can_reboot) | ||
{ | ||
if (can_reboot) { | ||
splExit(); | ||
} | ||
return; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#pragma once | ||
|
||
#include <stdlib.h> | ||
#include <stdio.h> | ||
#include <unistd.h> | ||
#include <switch.h> | ||
|
||
void reboot_to_payload(void); | ||
bool init_slp(void); | ||
void exit_spl(bool can_reboot); |