X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=ginge.git;a=blobdiff_plain;f=loader%2Femu.c;h=8234a1462def19c9061be3705b1cd2b93d63febf;hp=77f9a6dc343d2c8354f26515bab0a99eb84254f7;hb=6c888740e36d8ec83c68f35c5f14b8f698db7a2b;hpb=2692251daf4c8a3ca6986cece8f7fc0822de150f diff --git a/loader/emu.c b/loader/emu.c index 77f9a6d..8234a14 100644 --- a/loader/emu.c +++ b/loader/emu.c @@ -916,13 +916,18 @@ static void init_linkpage(void) static void segv_sigaction(int num, siginfo_t *info, void *ctx) { + extern char _init, _end; struct ucontext *context = ctx; u32 *regs = (u32 *)&context->uc_mcontext.arm_r0; u32 *pc = (u32 *)regs[15]; + u32 self_start, self_end; struct op_context *op_ctx; int i, lp_size; - if (((regs[15] ^ (u32)&segv_sigaction) & 0xff000000) == 0 || // PC is in our segment or + self_start = (u32)&_init & ~0xfff; + self_end = (u32)&_end; + + if ((self_start <= regs[15] && regs[15] <= self_end) || // PC is in our segment or (((regs[15] ^ (u32)g_linkpage) & ~(LINKPAGE_ALLOC - 1)) == 0) || // .. in linkpage ((long)info->si_addr & 0xffe00000) != 0x7f000000) // faulting not where expected { @@ -1259,10 +1264,11 @@ fail: return -EINVAL; } +static const char wm97xx_p[] = + "5507 0 -831476 0 -4218 16450692 65536"; // from 4.0 fw + long emu_do_read(int fd, void *buf, int count) { - static const char wm97xx_p[] = - "5507 0 -831476 0 -4218 16450692 65536"; // from 4.0 fw int ret, pressed = 0, x, y; struct { u16 pressure, x, y; @@ -1284,7 +1290,7 @@ long emu_do_read(int fd, void *buf, int count) case FAKEDEV_WM97XX: ret = host_read_ts(&pressed, &x, &y); if (ret == 0 && pressed) { - wm97xx.pressure = 1; + wm97xx.pressure = 0x8001; // TODO: check the real thing wm97xx.x = x * 3750 / 1024 + 200; wm97xx.y = 3750 - y * 3750 / 1024 + 200; } @@ -1303,7 +1309,7 @@ long emu_do_read(int fd, void *buf, int count) strncpy(buf, wm97xx_p, count); break; default: - err("read(%d, %d)\n", fd, count); + dbg("read(%d, %d)\n", fd, count); return -EINVAL; } return count; @@ -1365,9 +1371,23 @@ void *emu_do_fopen(const char *path, const char *mode) const char *w_path; FILE *ret; - w_path = emu_wrap_path(path); - ret = fopen(w_path, mode); - emu_wrap_path_free(w_path, path); + if (strcmp(path, "/etc/pointercal") == 0) { + // use local pontercal, not host's + ret = fopen("pointercal", mode); + if (ret == NULL) { + ret = fopen("pointercal", "w"); + if (ret != NULL) { + fwrite(wm97xx_p, 1, sizeof(wm97xx_p), ret); + fclose(ret); + } + ret = fopen("pointercal", mode); + } + } + else { + w_path = emu_wrap_path(path); + ret = fopen(w_path, mode); + emu_wrap_path_free(w_path, path); + } return ret; }