From 6bc0f0243543f60eee9a6f86f03b6d6ce3ad3617 Mon Sep 17 00:00:00 2001 From: Ash Date: Thu, 15 Jun 2017 15:20:05 +1000 Subject: [PATCH 1/3] Add Wii U files to .gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 62884e602a..87ff5b2caa 100644 --- a/.gitignore +++ b/.gitignore @@ -63,6 +63,11 @@ menu/driverspzarch.c /media/shaders_glsl/ /obj-w32/ +# Wii U +*.depend +*.rpx +wiiu/wut/elf2rpl/elf2rpl + # Ctags /tags From 7f5986e1d55711fc40c3f41d2e06f5c05c5ccd09 Mon Sep 17 00:00:00 2001 From: Ash Date: Thu, 15 Jun 2017 15:20:58 +1000 Subject: [PATCH 2/3] Rename Wii U log functions (conflict in DOSBox) --- frontend/drivers/platform_wiiu.c | 46 ++++++++++++++++---------------- wiiu/system/exception_handler.c | 4 +-- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c index cecbbb8097..0b22736e8f 100644 --- a/frontend/drivers/platform_wiiu.c +++ b/frontend/drivers/platform_wiiu.c @@ -310,14 +310,14 @@ frontend_ctx_driver_t frontend_ctx_wiiu = "wiiu", }; -static int log_socket = -1; -static volatile int log_lock = 0; +static int wiiu_log_socket = -1; +static volatile int wiiu_log_lock = 0; -void log_init(const char *ipString, int port) +void wiiu_log_init(const char *ipString, int port) { - log_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + wiiu_log_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (log_socket < 0) + if (wiiu_log_socket < 0) return; struct sockaddr_in connect_addr; @@ -326,37 +326,37 @@ void log_init(const char *ipString, int port) connect_addr.sin_port = port; inet_aton(ipString, &connect_addr.sin_addr); - if (connect(log_socket, (struct sockaddr *)&connect_addr, sizeof(connect_addr)) < 0) + if (connect(wiiu_log_socket, (struct sockaddr *)&connect_addr, sizeof(connect_addr)) < 0) { - socketclose(log_socket); - log_socket = -1; + socketclose(wiiu_log_socket); + wiiu_log_socket = -1; } } -void log_deinit(void) +void wiiu_log_deinit(void) { - if (log_socket >= 0) + if (wiiu_log_socket >= 0) { - socketclose(log_socket); - log_socket = -1; + socketclose(wiiu_log_socket); + wiiu_log_socket = -1; } } -static ssize_t log_write(struct _reent *r, void *fd, const char *ptr, size_t len) +static ssize_t wiiu_log_write(struct _reent *r, void *fd, const char *ptr, size_t len) { - if (log_socket < 0) + if (wiiu_log_socket < 0) return len; - while (log_lock) + while (wiiu_log_lock) OSSleepTicks(((248625000 / 4)) / 1000); - log_lock = 1; + wiiu_log_lock = 1; int ret; while (len > 0) { int block = len < 1400 ? len : 1400; // take max 1400 bytes per UDP packet - ret = send(log_socket, ptr, block, 0); + ret = send(wiiu_log_socket, ptr, block, 0); if (ret < 0) break; @@ -365,18 +365,18 @@ static ssize_t log_write(struct _reent *r, void *fd, const char *ptr, size_t len ptr += ret; } - log_lock = 0; + wiiu_log_lock = 0; return len; } void net_print(const char *str) { - log_write(NULL, 0, str, strlen(str)); + wiiu_log_write(NULL, 0, str, strlen(str)); } void net_print_exp(const char *str) { - send(log_socket, str, strlen(str), 0); + send(wiiu_log_socket, str, strlen(str), 0); } static devoptab_t dotab_stdout = @@ -385,7 +385,7 @@ static devoptab_t dotab_stdout = 0, // size of file structure NULL, // device open NULL, // device close - log_write, // device write + wiiu_log_write, // device write NULL, /* ... */ }; @@ -420,7 +420,7 @@ int main(int argc, char **argv) network_init(); #endif #if defined(PC_DEVELOPMENT_IP_ADDRESS) && defined(PC_DEVELOPMENT_TCP_PORT) - log_init(PC_DEVELOPMENT_IP_ADDRESS, PC_DEVELOPMENT_TCP_PORT); + wiiu_log_init(PC_DEVELOPMENT_IP_ADDRESS, PC_DEVELOPMENT_TCP_PORT); devoptab_list[STD_OUT] = &dotab_stdout; devoptab_list[STD_ERR] = &dotab_stdout; #endif @@ -504,7 +504,7 @@ int main(int argc, char **argv) ProcUIShutdown(); #if defined(PC_DEVELOPMENT_IP_ADDRESS) && defined(PC_DEVELOPMENT_TCP_PORT) - log_deinit(); + wiiu_log_deinit(); #endif /* returning non 0 here can prevent loading a different rpx/elf in the HBL environment */ diff --git a/wiiu/system/exception_handler.c b/wiiu/system/exception_handler.c index d7512cbd68..2a20b600ff 100644 --- a/wiiu/system/exception_handler.c +++ b/wiiu/system/exception_handler.c @@ -81,7 +81,7 @@ static const char exception_print_formats[18][45] = "%p: %08X %08X %08X %08X\n", // 17 }; void net_print_exp(const char* str); -void log_deinit(void); +void wiiu_log_deinit(void); static unsigned char exception_cb(void* c, unsigned char exception_type) { @@ -182,7 +182,7 @@ static unsigned char exception_cb(void* c, unsigned char exception_type) //} net_print_exp(gdb_buf); // net_print_exp(buf); - log_deinit(); + wiiu_log_deinit(); OSFatal(buf); return 1; } From 2492f3d6b38a74bf77774429fff4d7ff65aee40b Mon Sep 17 00:00:00 2001 From: Ash Date: Thu, 15 Jun 2017 15:21:38 +1000 Subject: [PATCH 3/3] Add missing_libc_functions.c (for DOSBox) --- Makefile.wiiu | 1 + wiiu/system/missing_libc_functions.c | 61 ++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 wiiu/system/missing_libc_functions.c diff --git a/Makefile.wiiu b/Makefile.wiiu index b75cdee7a7..723f484639 100644 --- a/Makefile.wiiu +++ b/Makefile.wiiu @@ -11,6 +11,7 @@ PC_DEVELOPMENT_TCP_PORT ?= OBJ := OBJ += wiiu/system/memory.o OBJ += wiiu/system/exception_handler.o +OBJ += wiiu/system/missing_libc_functions.o OBJ += wiiu/fs/sd_fat_devoptab.o OBJ += wiiu/fs/fs_utils.o OBJ += wiiu/controller_patcher/ControllerPatcher.o diff --git a/wiiu/system/missing_libc_functions.c b/wiiu/system/missing_libc_functions.c new file mode 100644 index 0000000000..f192aeead0 --- /dev/null +++ b/wiiu/system/missing_libc_functions.c @@ -0,0 +1,61 @@ +/* devkitPPC is missing a few functions that are kinda needed for some cores. + * This should add them back in. + */ + +#include +#include +#include +#include +#include + +//This is usually in libogc; we can't use that on wiiu +int usleep(useconds_t microseconds) { + OSSleepTicks(us_to_ticks(microseconds)); + return 0; +} + +//Can't find this one anywhere for some reason :/ +//This could probably be done a lot better with some love +int access(const char* path, int mode) { + return 0; //TODO temp hack, real code below + + FILE* fd = fopen(path, "rb"); + if (fd < 0) { + fclose(fd); + //We're supposed to set errono here + return -1; + } else { + fclose(fd); + return 0; + } +} + +//Just hardcode the Linux User ID, we're not on linux anyway +//Feasible cool addition: nn::act for this? +uid_t getuid() { + return 1000; +} + +//Fake user info +//Not thread safe, but avoids returning local variable, so... +struct passwd out; +struct passwd* getpwuid(uid_t uid) { + out.pw_name = "retroarch"; + out.pw_passwd = "Wait, what?"; + out.pw_uid = uid; + out.pw_gid = 1000; + out.pw_gecos = "retroarch"; + out.pw_dir = "sd:/"; + out.pw_shell = "/vol/system_slc/fw.img"; + + return &out; +} + +//Try to vaugely spoof the POISX clock. Epoch is off by about 30 +//years, so this could be better... +//Only has second accuracy since I'm lazy. +int clock_gettime(clockid_t clk_id, struct timespec* tp) { + int64_t time_usec = cpu_features_get_time_usec(); + tp->tv_sec = time_usec / 1000000; + return 0; +}