Fix Miiverse and add debugging prints

This commit is contained in:
BullyWiiPlaza 2017-04-20 17:17:49 +02:00
parent 669d0f9c2f
commit 8a0413ab85
7 changed files with 75 additions and 26 deletions

View File

@ -49,7 +49,7 @@ extern void (* GX2SwapScanBuffers)(void);
extern void (* GX2SetTVEnable)(s32 enable); extern void (* GX2SetTVEnable)(s32 enable);
extern void (* GX2SetSwapInterval)(u32 swap_interval); extern void (* GX2SetSwapInterval)(u32 swap_interval);
extern u32 (* GX2GetSwapInterval)(void); extern u32 (* GX2GetSwapInterval)(void);
extern void (* GX2WaitForVsync)(void); extern void (* GX2WaitForVsync)(void); // Wait until the next vertical sync happens.
extern void (* GX2CalcTVSize)(s32 tv_render_mode, s32 format, s32 buffering_mode, u32 * size, s32 * scale_needed); extern void (* GX2CalcTVSize)(s32 tv_render_mode, s32 format, s32 buffering_mode, u32 * size, s32 * scale_needed);
extern void (* GX2Invalidate)(s32 invalidate_type, void * ptr, u32 buffer_size); extern void (* GX2Invalidate)(s32 invalidate_type, void * ptr, u32 buffer_size);
extern void (* GX2SetTVBuffer)(void *buffer, u32 buffer_size, s32 tv_render_mode, s32 format, s32 buffering_mode); extern void (* GX2SetTVBuffer)(void *buffer, u32 buffer_size, s32 tv_render_mode, s32 format, s32 buffering_mode);

View File

@ -5,18 +5,31 @@
#include "common/common.h" #include "common/common.h"
#include "pygecko.h" #include "pygecko.h"
#include "main.h" #include "main.h"
#include "utils/logger.h"
#define TITLE_ID_MII_VERSE 0x000500301001600A
#define TITLE_ID_MII_MAKER 0x000500101004A000
#define TITLE_ID_BAYONETTA_2 0x0005000010172500
bool isRunningTitleID(unsigned long long int japaneseTitleID) {
return OSGetTitleID() == japaneseTitleID // JAP
|| OSGetTitleID() == japaneseTitleID + 0x100 // USA
|| OSGetTitleID() == japaneseTitleID + 0x200; // EUR
}
int __entry_menu(int argc, char **argv) { int __entry_menu(int argc, char **argv) {
if (OSGetTitleID != 0 && if (OSGetTitleID != 0
OSGetTitleID() != 0x000500101004A200 && // mii maker eur && !isRunningTitleID(TITLE_ID_MII_VERSE)
OSGetTitleID() != 0x000500101004A100 && // mii maker usa && !isRunningTitleID(TITLE_ID_MII_MAKER)
OSGetTitleID() != 0x000500101004A000) // mii maker jpn) && !isRunningTitleID(TITLE_ID_BAYONETTA_2)) {
{
InitOSFunctionPointers(); InitOSFunctionPointers();
InitSocketFunctionPointers(); InitSocketFunctionPointers();
InitGX2FunctionPointers(); InitGX2FunctionPointers();
log_init(COMPUTER_IP_ADDRESS);
log_print("OSGetTitleID checks passed...\n");
startTCPGecko(); startTCPGecko();
return EXIT_RELAUNCH_ON_LOAD; return EXIT_RELAUNCH_ON_LOAD;
} }

6
src/entry.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef TCPGECKO_ENTRY_H
#define TCPGECKO_ENTRY_H
bool isRunningTitleID(unsigned long long int japaneseTitleID);
#endif

View File

@ -211,8 +211,6 @@ int Menu_Main(void) {
if (launchMethod == 0) { if (launchMethod == 0) {
RestoreInstructions(); RestoreInstructions();
return EXIT_SUCCESS; return EXIT_SUCCESS;
} else if (launchMethod == 1) {
startMiiMaker();
} else { } else {
SYSLaunchMenu(); SYSLaunchMenu();
} }

View File

@ -9,6 +9,8 @@
extern "C" { extern "C" {
#endif #endif
#define COMPUTER_IP_ADDRESS "192.168.2.103"
//! C wrapper for our C++ functions //! C wrapper for our C++ functions
int Menu_Main(void); int Menu_Main(void);

View File

@ -15,6 +15,7 @@
#include "system/exception_handler.h" #include "system/exception_handler.h"
#include "utils/logger.h" #include "utils/logger.h"
#include "system/memory.h" #include "system/memory.h"
#include "entry.h"
void *client; void *client;
void *commandBlock; void *commandBlock;
@ -68,7 +69,7 @@ struct pygecko_bss_t {
#define EWOULDBLOCK 6 #define EWOULDBLOCK 6
#define DATA_BUFFER_SIZE 0x5000 #define DATA_BUFFER_SIZE 0x5000
#define WRITE_SCREEN_MESSAGE_BUFFER_SIZE 100 #define WRITE_SCREEN_MESSAGE_BUFFER_SIZE 100
#define SERVER_VERSION "04/16/2017" #define SERVER_VERSION "04/20/2017"
#define ONLY_ZEROS_READ 0xB0 #define ONLY_ZEROS_READ 0xB0
#define NON_ZEROS_READ 0xBD #define NON_ZEROS_READ 0xBD
@ -454,7 +455,7 @@ int kernelMemoryCompare(const void *sourceBuffer,
return kern_read(sourceBuffer) - kern_read(destinationBuffer); return kern_read(sourceBuffer) - kern_read(destinationBuffer);
} }
static int listenForCommands(struct pygecko_bss_t *bss, int clientfd) { static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
int ret; int ret;
// Hold the command and the data // Hold the command and the data
@ -1036,7 +1037,11 @@ static int listenForCommands(struct pygecko_bss_t *bss, int clientfd) {
break; break;
} }
case COMMAND_IOSUHAX_READ_FILE: { case COMMAND_IOSUHAX_READ_FILE: {
log_print("COMMAND_IOSUHAX_READ_FILE");
// TODO Crashes console on this call
int returnValue = IOSUHAX_Open(NULL); int returnValue = IOSUHAX_Open(NULL);
log_print("IOSUHAX_Open Done");
log_printf("IOSUHAX_Open: %i", returnValue); log_printf("IOSUHAX_Open: %i", returnValue);
if (returnValue < 0) { if (returnValue < 0) {
@ -1059,15 +1064,15 @@ static int listenForCommands(struct pygecko_bss_t *bss, int clientfd) {
goto IOSUHAX_OPEN_FILE_FAILED; goto IOSUHAX_OPEN_FILE_FAILED;
} }
fileStat_s stats; fileStat_s fileStat;
returnValue = IOSUHAX_FSA_StatFile(fileSystemFileDescriptor, fileDescriptor, &stats); returnValue = IOSUHAX_FSA_StatFile(fileSystemFileDescriptor, fileDescriptor, &fileStat);
log_printf("IOSUHAX_FSA_StatFile: %i", returnValue); log_printf("IOSUHAX_FSA_StatFile: %i", returnValue);
if (returnValue < 0) { if (returnValue < 0) {
goto IOSUHAX_READ_FILE_FAILED_CLOSE; goto IOSUHAX_READ_FILE_FAILED_CLOSE;
} }
void *fileBuffer = MEMBucket_alloc(stats.size, 4); void *fileBuffer = MEMBucket_alloc(fileStat.size, 4);
log_printf("File Buffer: %p", fileBuffer); log_printf("File Buffer: %p", fileBuffer);
if (!fileBuffer) { if (!fileBuffer) {
@ -1075,8 +1080,8 @@ static int listenForCommands(struct pygecko_bss_t *bss, int clientfd) {
} }
size_t totalBytesRead = 0; size_t totalBytesRead = 0;
while (totalBytesRead < stats.size) { while (totalBytesRead < fileStat.size) {
size_t remainingBytes = stats.size - totalBytesRead; size_t remainingBytes = fileStat.size - totalBytesRead;
int bytesRead = IOSUHAX_FSA_ReadFile(fileSystemFileDescriptor, int bytesRead = IOSUHAX_FSA_ReadFile(fileSystemFileDescriptor,
fileBuffer + totalBytesRead, fileBuffer + totalBytesRead,
0x01, 0x01,
@ -1442,42 +1447,52 @@ static int listenForCommands(struct pygecko_bss_t *bss, int clientfd) {
return 0; return 0;
} }
int sockfd = -1, clientfd = -1, ret = 0, len;
struct sockaddr_in socketAddress;
struct pygecko_bss_t *bss;
static int runTCPGeckoServer(int argc, void *argv) { static int runTCPGeckoServer(int argc, void *argv) {
int sockfd = -1, clientfd = -1, ret = 0, len; bss = argv;
struct sockaddr_in addr;
struct pygecko_bss_t *bss = argv;
setup_os_exceptions(); setup_os_exceptions();
socket_lib_init(); socket_lib_init();
log_init("192.168.2.103"); log_init(COMPUTER_IP_ADDRESS);
log_print("TCP Gecko Installer\n");
while (true) { while (true) {
addr.sin_family = AF_INET; socketAddress.sin_family = AF_INET;
addr.sin_port = 7331; socketAddress.sin_port = 7331;
addr.sin_addr.s_addr = 0; socketAddress.sin_addr.s_addr = 0;
log_printf("socket()...\n");
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
CHECK_ERROR(sockfd == -1) CHECK_ERROR(sockfd == -1)
ret = bind(sockfd, (void *) &addr, 16); log_printf("bind()...\n");
ret = bind(sockfd, (void *) &socketAddress, 16);
CHECK_ERROR(ret < 0) CHECK_ERROR(ret < 0)
log_printf("listen()...\n");
ret = listen(sockfd, 20); ret = listen(sockfd, 20);
CHECK_ERROR(ret < 0) CHECK_ERROR(ret < 0)
while (true) { while (true) {
log_printf("accept()...\n");
len = 16; len = 16;
clientfd = accept(sockfd, (void *) &addr, &len); clientfd = accept(sockfd, (void *) &socketAddress, &len);
CHECK_ERROR(clientfd == -1) CHECK_ERROR(clientfd == -1)
ret = listenForCommands(bss, clientfd); log_printf("commands()...\n");
ret = processCommands(bss, clientfd);
CHECK_ERROR(ret < 0) CHECK_ERROR(ret < 0)
socketclose(clientfd); socketclose(clientfd);
clientfd = -1; clientfd = -1;
log_printf("GX2WaitForVsync() inner...\n");
GX2WaitForVsync();
} }
error: error:
log_printf("error, closing connection...\n");
if (clientfd != -1) if (clientfd != -1)
socketclose(clientfd); socketclose(clientfd);
if (sockfd != -1) if (sockfd != -1)
@ -1485,6 +1500,7 @@ static int runTCPGeckoServer(int argc, void *argv) {
bss->error = ret; bss->error = ret;
// Fix the console freezing when e.g. going to the friend list // Fix the console freezing when e.g. going to the friend list
log_printf("GX2WaitForVsync() outer...\n");
GX2WaitForVsync(); GX2WaitForVsync();
} }
@ -1492,6 +1508,9 @@ static int runTCPGeckoServer(int argc, void *argv) {
} }
static int startTCPGeckoThread(int argc, void *argv) { static int startTCPGeckoThread(int argc, void *argv) {
log_init(COMPUTER_IP_ADDRESS);
log_print("Starting TCP Gecko thread...\n");
// Run the TCP Gecko Installer server // Run the TCP Gecko Installer server
struct pygecko_bss_t *bss; struct pygecko_bss_t *bss;
@ -1508,20 +1527,29 @@ static int startTCPGeckoThread(int argc, void *argv) {
free(bss); free(bss);
} }
log_print("TCP Gecko thread started...\n");
// Execute the code handler if it is installed // Execute the code handler if it is installed
if (codeHandlerInstalled) { if (codeHandlerInstalled) {
log_print("Code handler installed...\n");
void (*codeHandlerFunction)() = (void (*)()) CODE_HANDLER_INSTALL_ADDRESS; void (*codeHandlerFunction)() = (void (*)()) CODE_HANDLER_INSTALL_ADDRESS;
while (true) { while (true) {
usleep(9000); usleep(9000);
// log_print("Running code handler...\n");
codeHandlerFunction(); codeHandlerFunction();
} }
} else {
log_print("Code handler not installed...\n");
} }
return 0; return 0;
} }
void startTCPGecko() { void startTCPGecko() {
log_init(COMPUTER_IP_ADDRESS);
log_print("Starting TCP Gecko...\n");
// Force the debugger to be initialized by default // Force the debugger to be initialized by default
// writeInt((unsigned int) (OSIsDebuggerInitialized + 0x1C), 0x38000001); // li r3, 1 // writeInt((unsigned int) (OSIsDebuggerInitialized + 0x1C), 0x38000001); // li r3, 1
@ -1538,4 +1566,6 @@ void startTCPGecko() {
ASSERT_INTEGER(status, 1, "Creating TCP Gecko thread") ASSERT_INTEGER(status, 1, "Creating TCP Gecko thread")
// OSSetThreadName(thread, "TCP Gecko"); // OSSetThreadName(thread, "TCP Gecko");
OSResumeThread(thread); OSResumeThread(thread);
log_print("TCP Gecko started...\n");
} }

Binary file not shown.