mirror of
https://github.com/suchmememanyskill/TegraExplorer.git
synced 2024-11-22 20:06:43 +00:00
Add (Broken) payload launching
This commit is contained in:
parent
819d08415d
commit
ada4fd2c7f
5 changed files with 113 additions and 6 deletions
81
source/meme/external_utils.c
Normal file
81
source/meme/external_utils.c
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
#include "external_utils.h"
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "../gfx/di.h"
|
||||||
|
#include "../gfx/gfx.h"
|
||||||
|
#include "../utils/btn.h"
|
||||||
|
#include "../utils/util.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "../libs/fatfs/ff.h"
|
||||||
|
#include "../storage/sdmmc.h"
|
||||||
|
#include "graphics.h"
|
||||||
|
#include "../soc/hw_init.h"
|
||||||
|
#include "../mem/emc.h"
|
||||||
|
#include "../mem/sdram.h"
|
||||||
|
#include "../soc/t210.h"
|
||||||
|
|
||||||
|
extern void reloc_patcher(u32 payload_dst, u32 payload_src, u32 payload_size);
|
||||||
|
extern boot_cfg_t b_cfg;
|
||||||
|
extern bool sd_mount();
|
||||||
|
extern void sd_unmount();
|
||||||
|
|
||||||
|
int launch_payload(char *path, int update){
|
||||||
|
if (!update)
|
||||||
|
gfx_clear_grey(0x1B);
|
||||||
|
gfx_con_setpos(0, 0);
|
||||||
|
if (!path)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (sd_mount()){
|
||||||
|
FIL fp;
|
||||||
|
if (f_open(&fp, path, FA_READ)){
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read and copy the payload to our chosen address
|
||||||
|
void *buf;
|
||||||
|
u32 size = f_size(&fp);
|
||||||
|
|
||||||
|
if (size < 0x30000)
|
||||||
|
buf = (void *)RCM_PAYLOAD_ADDR;
|
||||||
|
else
|
||||||
|
buf = (void *)COREBOOT_ADDR;
|
||||||
|
|
||||||
|
if (f_read(&fp, buf, size, NULL)){
|
||||||
|
f_close(&fp);
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
f_close(&fp);
|
||||||
|
free(path);
|
||||||
|
|
||||||
|
if (size < 0x30000){
|
||||||
|
if (update)
|
||||||
|
memcpy((u8 *)(RCM_PAYLOAD_ADDR + PATCHED_RELOC_SZ), &b_cfg, sizeof(boot_cfg_t)); // Transfer boot cfg.
|
||||||
|
else
|
||||||
|
reloc_patcher(PATCHED_RELOC_ENTRY, EXT_PAYLOAD_ADDR, ALIGN(size, 0x10));
|
||||||
|
|
||||||
|
reconfig_hw_workaround(false, byte_swap_32(*(u32 *)(buf + size - sizeof(u32))));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
reloc_patcher(PATCHED_RELOC_ENTRY, EXT_PAYLOAD_ADDR, 0x7000);
|
||||||
|
reconfig_hw_workaround(true, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void (*ext_payload_ptr)() = (void *)EXT_PAYLOAD_ADDR;
|
||||||
|
void (*update_ptr)() = (void *)RCM_PAYLOAD_ADDR;
|
||||||
|
|
||||||
|
msleep(100);
|
||||||
|
|
||||||
|
// Launch our payload.
|
||||||
|
if (!update)
|
||||||
|
(*ext_payload_ptr)();
|
||||||
|
else {
|
||||||
|
EMC(EMC_SCRATCH0) |= EMC_HEKA_UPD;
|
||||||
|
(*update_ptr)();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 4;
|
||||||
|
}
|
15
source/meme/external_utils.h
Normal file
15
source/meme/external_utils.h
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define RELOC_META_OFF 0x7C
|
||||||
|
#define PATCHED_RELOC_SZ 0x94
|
||||||
|
#define PATCHED_RELOC_STACK 0x40007000
|
||||||
|
#define PATCHED_RELOC_ENTRY 0x40010000
|
||||||
|
#define EXT_PAYLOAD_ADDR 0xC03C0000
|
||||||
|
#define RCM_PAYLOAD_ADDR (EXT_PAYLOAD_ADDR + ALIGN(PATCHED_RELOC_SZ, 0x10))
|
||||||
|
#define COREBOOT_ADDR (0xD0000000 - 0x100000)
|
||||||
|
#define CBFS_DRAM_EN_ADDR 0x4003e000
|
||||||
|
#define CBFS_DRAM_MAGIC 0x4452414D // "DRAM"
|
||||||
|
#define EMC_BASE 0x7001B000
|
||||||
|
#define EMC(off) _REG(EMC_BASE, off)
|
||||||
|
|
||||||
|
int launch_payload(char *path, int update);
|
|
@ -7,20 +7,28 @@
|
||||||
#include "../libs/fatfs/ff.h"
|
#include "../libs/fatfs/ff.h"
|
||||||
#include "../storage/sdmmc.h"
|
#include "../storage/sdmmc.h"
|
||||||
#include "graphics.h"
|
#include "graphics.h"
|
||||||
|
#include "external_utils.h"
|
||||||
|
|
||||||
int _openfilemenu(const char *path, char *clipboardpath){
|
int _openfilemenu(char *path, char *clipboardpath){
|
||||||
meme_clearscreen();
|
meme_clearscreen();
|
||||||
FILINFO fno;
|
FILINFO fno;
|
||||||
f_stat(path, &fno);
|
f_stat(path, &fno);
|
||||||
char *options[4];
|
char *options[5];
|
||||||
int res = 0;
|
int res = 0;
|
||||||
int mres = -1;
|
int mres = -1;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
int i = 4;
|
||||||
|
bool payload = false;
|
||||||
|
|
||||||
addchartoarray("Back", options, 0);
|
addchartoarray("Back", options, 0);
|
||||||
addchartoarray("Copy to clipboard", options, 1);
|
addchartoarray("Copy to clipboard", options, 1);
|
||||||
addchartoarray("Move to clipboard", options, 2);
|
addchartoarray("Move to clipboard", options, 2);
|
||||||
addchartoarray("Delete file", options, 3);
|
addchartoarray("Delete file", options, 3);
|
||||||
|
if (strstr(path, ".bin") != NULL){
|
||||||
|
addchartoarray("Launch payload", options, i);
|
||||||
|
payload = true;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
gfx_printf("%kPath: %s%k\n\n", COLOR_GREEN, path, COLOR_WHITE);
|
gfx_printf("%kPath: %s%k\n\n", COLOR_GREEN, path, COLOR_WHITE);
|
||||||
|
|
||||||
|
@ -29,8 +37,10 @@ int _openfilemenu(const char *path, char *clipboardpath){
|
||||||
|
|
||||||
gfx_printf("Size: %s", size);
|
gfx_printf("Size: %s", size);
|
||||||
|
|
||||||
res = gfx_menulist(160, options, 4);
|
res = gfx_menulist(160, options, i);
|
||||||
switch(res){
|
switch(res){
|
||||||
|
case 1:
|
||||||
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
ret = 0;
|
ret = 0;
|
||||||
strcpy(clipboardpath, path);
|
strcpy(clipboardpath, path);
|
||||||
|
@ -44,7 +54,7 @@ int _openfilemenu(const char *path, char *clipboardpath){
|
||||||
if (mres == 0) f_unlink(path);
|
if (mres == 0) f_unlink(path);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
if (payload) launch_payload(path, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
meme_clearscreen();
|
meme_clearscreen();
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "../storage/sdmmc.h"
|
#include "../storage/sdmmc.h"
|
||||||
#include "graphics.h"
|
#include "graphics.h"
|
||||||
|
|
||||||
|
|
||||||
void utils_gfx_init(){
|
void utils_gfx_init(){
|
||||||
display_backlight_brightness(100, 1000);
|
display_backlight_brightness(100, 1000);
|
||||||
gfx_clear_grey(0x1B);
|
gfx_clear_grey(0x1B);
|
||||||
|
@ -28,7 +29,7 @@ void addpartpath(char *path, char *add){
|
||||||
strcat(path, add);
|
strcat(path, add);
|
||||||
}
|
}
|
||||||
|
|
||||||
void return_readable_byte_amounts(int size, char *in){
|
void return_readable_byte_amounts(unsigned long int size, char *in){
|
||||||
char type[3];
|
char type[3];
|
||||||
unsigned long int sizetemp = size;
|
unsigned long int sizetemp = size;
|
||||||
int muhbytes = 0;
|
int muhbytes = 0;
|
||||||
|
|
|
@ -15,5 +15,5 @@ int readfolder(char *items[], unsigned int *muhbits, const char *path);
|
||||||
int copy(const char *src, const char *dst);
|
int copy(const char *src, const char *dst);
|
||||||
void addchartoarray(char *add, char *items[], int spot);
|
void addchartoarray(char *add, char *items[], int spot);
|
||||||
int copywithpath(const char *src, const char *dstpath, int mode);
|
int copywithpath(const char *src, const char *dstpath, int mode);
|
||||||
void return_readable_byte_amounts(int size, char *in);
|
void return_readable_byte_amounts(unsigned long int size, char *in);
|
||||||
int getfilesize(const char *path);
|
int getfilesize(const char *path);
|
Loading…
Reference in a new issue