X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=ginge.git;a=blobdiff_plain;f=loader%2Fpatches.c;h=4b1735e48675cd89f61753b9ca0c238ea0a9b969;hp=f7e0b110c1f660e4440e5f912fefef7c2934d11f;hb=499bf01c2f0e075caeb23714e3376a641c04eb7c;hpb=dc90c02d39fc8968d2078512e228d99e7c553267 diff --git a/loader/patches.c b/loader/patches.c index f7e0b11..4b1735e 100644 --- a/loader/patches.c +++ b/loader/patches.c @@ -1,21 +1,15 @@ -// vim:shiftwidth=2:expandtab +/* + * GINGE - GINGE Is Not Gp2x Emulator + * (C) notaz, 2010-2011 + * + * This work is licensed under the MAME license, see COPYING file for details. + */ #include -#include -#include -#include -#include -#include -#include -#include #include "header.h" #include "sys_cacheflush.h" -#if 0 -#define strace printf -#else -#define strace(...) -#endif +#include "override.c" // note: first mask must be always full for search algo static const unsigned int sig_mask_all[] = { @@ -33,11 +27,11 @@ static const unsigned int sig_mmap[] = { }; #define sig_mask_mmap sig_mask_all -static const unsigned int sig_mmap_[] = { +static const unsigned int sig_mmap2[] = { 0xe52d5004, 0xe59d5008, 0xe52d4004, 0xe59d4008, 0xe1b0ca05, 0x1a000006, 0xe1a05625, 0xef9000c0 }; -#define sig_mask_mmap_ sig_mask_all +#define sig_mask_mmap2 sig_mask_all static const unsigned int sig_read[] = { 0xe59fc080, 0xe59cc000, 0xe33c0000, 0x1a000003, 0xef900003 @@ -56,91 +50,25 @@ static const unsigned int sig_mask_sigaction[] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xff000000, 0xff000000 }; -static const struct dev_fd_t takeover_devs[] = { - { "/dev/mem", FAKEDEV_MEM }, - { "/dev/GPIO", FAKEDEV_GPIO }, - { "/dev/fb0", FAKEDEV_FB0 }, - { "/dev/fb/0", FAKEDEV_FB0 }, - { "/dev/fb1", FAKEDEV_FB1 }, - { "/dev/fb/1", FAKEDEV_FB1 }, - { "/dev/mmuhack", FAKEDEV_MMUHACK }, +static const unsigned int sig_execve[] = { + 0xef90000b, 0xe1a04000, 0xe3700a01 }; +#define sig_mask_execve sig_mask_all -static int w_open(const char *pathname, int flags, mode_t mode) -{ - int i, ret; - - for (i = 0; i < ARRAY_SIZE(takeover_devs); i++) { - if (strcmp(pathname, takeover_devs[i].name) == 0) { - ret = takeover_devs[i].fd; - break; - } - } - - if (i == ARRAY_SIZE(takeover_devs)) - ret = open(pathname, flags, mode); - - if (ret >= 0) { - for (i = 0; emu_interesting_fds[i].name != NULL; i++) { - if (strcmp(pathname, emu_interesting_fds[i].name) == 0) { - emu_interesting_fds[i].fd = ret; - break; - } - } - } - - strace("open(%s) = %d\n", pathname, ret); - return ret; -} - -static void *w_mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) -{ - void *ret; - if (FAKEDEV_MEM <= fd && fd < FAKEDEV_FD_BOUNDARY) - ret = emu_do_mmap(length, prot, flags, fd, offset); - else - ret = mmap(addr, length, prot, flags, fd, offset); - - // threads are using heap before they mmap their stack - // printf needs valid stack for pthtead/errno - if (((long)&ret & 0xf0000000) == 0xb0000000) - strace("mmap(%p, %x, %x, %x, %d, %lx) = %p\n", addr, length, prot, flags, fd, (long)offset, ret); - return ret; -} -#define w_mmap_ w_mmap - -static ssize_t w_read(int fd, void *buf, size_t count) -{ - ssize_t ret; - if (fd != FAKEDEV_GPIO) - return read(fd, buf, count); - - ret = emu_read_gpiodev(buf, count); - //strace("read(%d, %p, %d) = %d\n", fd, buf, count, ret); - return ret; -} - -static int w_ioctl(int fd, int request, void *argp) -{ - int ret; - - if ((FAKEDEV_MEM <= fd && fd < FAKEDEV_FD_BOUNDARY) || - fd == emu_interesting_fds[IFD_SOUND].fd) - ret = emu_do_ioctl(fd, request, argp); - else - ret = ioctl(fd, request, argp); - - strace("ioctl(%d, %08x, %p) = %d\n", fd, request, argp, ret); - return ret; -} +static const unsigned int sig_execve2[] = { + 0xef90000b, 0xe3700a01, 0xe1a04000 +}; +#define sig_mask_execve2 sig_mask_all -static int w_sigaction(int signum, const void *act, void *oldact) -{ - strace("sigaction(%d, %p, %p) = %d\n", signum, act, oldact, 0); - return 0; -} +static const unsigned int sig_chdir[] = { + 0xef90000c, 0xe3700a01, 0x312fff1e, 0xea0004bb +}; +static const unsigned int sig_mask_chdir[] = { + 0xffffffff, 0xffffffff, 0xffffffff, 0xff000000 +}; -#define PATCH(f) { sig_##f, sig_mask_##f, ARRAY_SIZE(sig_##f), w_##f } +#define PATCH_(f,p) { sig_##p, sig_mask_##p, ARRAY_SIZE(sig_##p), w_##f } +#define PATCH(f) PATCH_(f,f) static const struct { const unsigned int *sig; @@ -150,10 +78,12 @@ static const struct { } patches[] = { PATCH(open), PATCH(mmap), - PATCH(mmap_), // mmap using mmap2 syscall + PATCH(mmap2), // mmap2 syscall PATCH(read), PATCH(ioctl), PATCH(sigaction), +// PATCH_(execve, execve2), // hangs + PATCH(chdir), }; void do_patches(void *ptr, unsigned int size) @@ -190,3 +120,4 @@ found: sys_cacheflush(ptr, (char *)ptr + size); } +// vim:shiftwidth=2:expandtab