Cleanup initialization process, check for service access instead of 3dsx to determine use of svchax.

This commit is contained in:
Steven Smith 2016-09-29 15:39:34 -07:00
parent 71e670edde
commit 417c345141
3 changed files with 87 additions and 40 deletions

View File

@ -88,7 +88,7 @@ static Result spi_get_page_size(SaveChip chip, u32* pageSize) {
size = 256; size = 256;
break; break;
default: default:
res = R_FBI_UNSUPPORTED_OPERATION; res = R_FBI_NOT_IMPLEMENTED;
break; break;
} }
@ -133,7 +133,7 @@ static Result spi_get_capacity(SaveChip chip, u32* capacity) {
cap = 8 * 1024 * 1024; cap = 8 * 1024 * 1024;
break; break;
default: default:
res = R_FBI_UNSUPPORTED_OPERATION; res = R_FBI_NOT_IMPLEMENTED;
break; break;
} }
@ -146,7 +146,7 @@ static Result spi_get_capacity(SaveChip chip, u32* capacity) {
static Result spi_execute_command(SaveChip chip, void* cmd, u32 cmdSize, void* answer, u32 answerSize, void* data, u32 dataSize) { static Result spi_execute_command(SaveChip chip, void* cmd, u32 cmdSize, void* answer, u32 answerSize, void* data, u32 dataSize) {
if(chip == CHIP_NONE) { if(chip == CHIP_NONE) {
return R_FBI_UNSUPPORTED_OPERATION; return R_FBI_NOT_IMPLEMENTED;
} }
bool infrared = chip == CHIP_FLASH_256KB_INFRARED || chip == CHIP_FLASH_512KB_INFRARED || chip == CHIP_FLASH_1MB_INFRARED || chip == CHIP_FLASH_8MB_INFRARED; bool infrared = chip == CHIP_FLASH_256KB_INFRARED || chip == CHIP_FLASH_512KB_INFRARED || chip == CHIP_FLASH_1MB_INFRARED || chip == CHIP_FLASH_8MB_INFRARED;
@ -277,7 +277,7 @@ static Result spi_read_data(SaveChip chip, u32* bytesRead, void* data, u32 offse
pos += size; pos += size;
break; break;
default: default:
res = R_FBI_UNSUPPORTED_OPERATION; res = R_FBI_NOT_IMPLEMENTED;
break; break;
} }
} }
@ -341,7 +341,7 @@ static Result spi_write_data(SaveChip chip, u32* bytesWritten, void* data, u32 o
case CHIP_FLASH_8MB: case CHIP_FLASH_8MB:
case CHIP_FLASH_8MB_INFRARED: case CHIP_FLASH_8MB_INFRARED:
default: default:
res = R_FBI_UNSUPPORTED_OPERATION; res = R_FBI_NOT_IMPLEMENTED;
break; break;
} }
@ -456,7 +456,7 @@ static Result spi_get_save_chip(SaveChip* chip, SaveChip base) {
if(base < CHIP_FLASH_256KB_INFRARED) { if(base < CHIP_FLASH_256KB_INFRARED) {
res = spi_get_save_chip(&c, CHIP_FLASH_256KB_INFRARED); res = spi_get_save_chip(&c, CHIP_FLASH_256KB_INFRARED);
} else { } else {
res = R_FBI_UNSUPPORTED_OPERATION; res = R_FBI_NOT_IMPLEMENTED;
} }
break; break;

View File

@ -6,11 +6,57 @@
#include "core/screen.h" #include "core/screen.h"
#include "core/util.h" #include "core/util.h"
#include "svchax/svchax.h" #include "svchax/svchax.h"
#include "ui/error.h"
#include "ui/mainmenu.h" #include "ui/mainmenu.h"
#include "ui/ui.h" #include "ui/ui.h"
#include "ui/section/task/task.h" #include "ui/section/task/task.h"
static void* soc_buffer; static void* soc_buffer = NULL;
static u32 old_time_limit = UINT32_MAX;
void cleanup_services() {
socExit();
if(soc_buffer != NULL) {
free(soc_buffer);
soc_buffer = NULL;
}
httpcExit();
pxiDevExit();
ptmuExit();
acExit();
cfguExit();
amExit();
}
Result init_services() {
Result res = 0;
Handle tempAM = 0;
if(R_SUCCEEDED(res = srvGetServiceHandle(&tempAM, "am:net"))) {
svcCloseHandle(tempAM);
if(R_SUCCEEDED(res = amInit())
&& R_SUCCEEDED(res = cfguInit())
&& R_SUCCEEDED(res = acInit())
&& R_SUCCEEDED(res = ptmuInit())
&& R_SUCCEEDED(res = pxiDevInit())
&& R_SUCCEEDED(res = httpcInit(0))) {
soc_buffer = memalign(0x1000, 0x100000);
if(soc_buffer != NULL) {
res = socInit(soc_buffer, 0x100000);
} else {
res = R_FBI_OUT_OF_MEMORY;
}
}
}
if(R_FAILED(res)) {
cleanup_services();
}
return res;
}
void cleanup() { void cleanup() {
clipboard_clear(); clipboard_clear();
@ -19,64 +65,65 @@ void cleanup() {
ui_exit(); ui_exit();
screen_exit(); screen_exit();
socExit(); if(old_time_limit != UINT32_MAX) {
if(soc_buffer != NULL) { APT_SetAppCpuTimeLimit(old_time_limit);
free(soc_buffer);
soc_buffer = NULL;
} }
amExit(); cleanup_services();
httpcExit();
pxiDevExit();
ptmuExit();
acExit();
cfguExit();
romfsExit(); romfsExit();
gfxExit(); gfxExit();
} }
int main(int argc, const char* argv[]) { void init() {
gfxInitDefault(); gfxInitDefault();
if(argc > 0) { Result romfsRes = romfsInit();
if(R_FAILED(romfsRes)) {
util_panic("Failed to mount RomFS: %08lX", romfsRes);
return;
}
if(R_FAILED(init_services())) {
svchax_init(true); svchax_init(true);
if(!__ctr_svchax || !__ctr_svchax_srv) { if(!__ctr_svchax || !__ctr_svchax_srv) {
util_panic("Failed to acquire kernel access."); util_panic("Failed to acquire kernel access.");
return 1; return;
} }
util_set_3dsx_path(argv[0]); Result initRes = init_services();
if(R_FAILED(initRes)) {
util_panic("Failed to initialize services: %08lX", initRes);
return;
}
} }
Result setCpuTimeRes = APT_SetAppCpuTimeLimit(30); APT_GetAppCpuTimeLimit(&old_time_limit);
if(R_FAILED(setCpuTimeRes)) { Result cpuRes = APT_SetAppCpuTimeLimit(30);
util_panic("Failed to set syscore CPU time limit: %08lX", setCpuTimeRes); if(R_FAILED(cpuRes)) {
return 1; util_panic("Failed to set syscore CPU time limit: %08lX", cpuRes);
return;
} }
romfsInit();
cfguInit();
acInit();
ptmuInit();
pxiDevInit();
httpcInit(0);
amInit();
AM_InitializeExternalTitleDatabase(false); AM_InitializeExternalTitleDatabase(false);
soc_buffer = memalign(0x1000, 0x100000);
if(soc_buffer != NULL) {
socInit(soc_buffer, 0x100000);
}
screen_init(); screen_init();
ui_init(); ui_init();
task_init(); task_init();
}
int main(int argc, const char* argv[]) {
if(argc > 0) {
util_set_3dsx_path(argv[0]);
}
init();
mainmenu_open(); mainmenu_open();
while(aptMainLoop() && ui_update()); while(aptMainLoop() && ui_update());
cleanup(); cleanup();
return 0; return 0;
} }

View File

@ -8,8 +8,8 @@
#define R_FBI_THREAD_CREATE_FAILED MAKERESULT(RL_PERMANENT, RS_INTERNAL, RM_APPLICATION, 6) #define R_FBI_THREAD_CREATE_FAILED MAKERESULT(RL_PERMANENT, RS_INTERNAL, RM_APPLICATION, 6)
#define R_FBI_PARSE_FAILED MAKERESULT(RL_PERMANENT, RS_INTERNAL, RM_APPLICATION, 7) #define R_FBI_PARSE_FAILED MAKERESULT(RL_PERMANENT, RS_INTERNAL, RM_APPLICATION, 7)
#define R_FBI_BAD_DATA MAKERESULT(RL_PERMANENT, RS_INTERNAL, RM_APPLICATION, 8) #define R_FBI_BAD_DATA MAKERESULT(RL_PERMANENT, RS_INTERNAL, RM_APPLICATION, 8)
#define R_FBI_UNSUPPORTED_OPERATION MAKERESULT(RL_PERMANENT, RS_INTERNAL, RM_APPLICATION, RD_NOT_IMPLEMENTED)
#define R_FBI_NOT_IMPLEMENTED MAKERESULT(RL_PERMANENT, RS_INTERNAL, RM_APPLICATION, RD_NOT_IMPLEMENTED)
#define R_FBI_OUT_OF_MEMORY MAKERESULT(RL_FATAL, RS_OUTOFRESOURCE, RM_APPLICATION, RD_OUT_OF_MEMORY) #define R_FBI_OUT_OF_MEMORY MAKERESULT(RL_FATAL, RS_OUTOFRESOURCE, RM_APPLICATION, RD_OUT_OF_MEMORY)
#define R_FBI_OUT_OF_RANGE MAKERESULT(RL_PERMANENT, RS_INVALIDARG, RM_APPLICATION, RD_OUT_OF_RANGE) #define R_FBI_OUT_OF_RANGE MAKERESULT(RL_PERMANENT, RS_INVALIDARG, RM_APPLICATION, RD_OUT_OF_RANGE)