// vim:shiftwidth=2:expandtab
+// a "gentle" reminder
+#ifdef __ARM_EABI__
+#error loader is meant to be OABI!
+#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <alloca.h>
+#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
// ???? ???? YXBA DURiLe ???? VdVuMS LR?? ????
// | GPIOC[31:16] | GPIOB[31:16] |
case 0xa058: // GPIOBPAD
- d = pollux.btn_state & 0x0300;
+ d = (pollux.btn_state >> 1) & 0x0100;
+ d |= (pollux.btn_state << 1) & 0x0200;
d |= (pollux.btn_state >> 3) & 0x0080;
d |= (pollux.btn_state >> 5) & 0x0040;
d |= (pollux.btn_state >> 6) & 0x0c00;
void *pret;
int ret;
+#ifdef PND
+ if (geteuid() == 0) {
+ fprintf(stderr, "don't try to run as root, device registers or memory "
+ "might get trashed crashing the OS or even damaging the device.\n");
+ exit(1);
+ }
+#endif
+
g_linkpage = (void *)(((u32)map_bottom - LINKPAGE_ALLOC) & ~0xfff);
pret = mmap(g_linkpage, LINKPAGE_ALLOC, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
exit(1);
}
-#ifdef WIZ
- // we are short on memmory on Wiz, need special handling
- extern void *host_mmap_upper(void);
- mmsp2.umem = host_mmap_upper();
-#else
+ // TODO: check if this really fails on Wiz..
mmsp2.umem = mmap(NULL, 0x2000000, PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+#ifdef WIZ
+ if (mmsp2.umem == MAP_FAILED) {
+ // we are short on memmory on Wiz, need special handling
+ extern void *host_mmap_upper(void);
+ mmsp2.umem = host_mmap_upper();
+ }
#endif
if (mmsp2.umem == MAP_FAILED) {
perror(PFX "mmap upper mem");
const char *from;
const char *to;
} path_map[] = {
- { "/mnt/tmp/", "/tmp/" },
+ { "/mnt/tmp", "./tmp" },
};
static const char *wrap_path(const char *path)
{
- char *buff;
+ char *buff, *p;
size_t size;
int i, len;
// do only path mapping for now
for (i = 0; i < ARRAY_SIZE(path_map); i++) {
- len = strlen(path_map[i].from);
- if (strncmp(path, path_map[i].from, len) == 0) {
+ p = strstr(path, path_map[i].from);
+ if (p != NULL) {
size = strlen(path) + strlen(path_map[i].to) + 1;
buff = malloc(size);
if (buff == NULL)
break;
- snprintf(buff, size, "%s%s", path_map[i].to, path + len);
+ len = p - path;
+ strncpy(buff, path, len);
+ snprintf(buff + len, size - len, "%s%s", path_map[i].to,
+ path + len + strlen(path_map[i].from));
dbg("mapped path \"%s\" -> \"%s\"\n", path, buff);
return buff;
}
int emu_do_system(const char *command)
{
static char tmp_path[512];
+ int need_ginge = 0;
const char *p2;
char *p;
int ret;
if (command == NULL)
return -1;
- // pass through stuff in PATH
- p = strchr(command, ' ');
- p2 = strchr(command, '/');
- if (p2 == NULL || (p != NULL && p2 > p))
- return system(command);
+ for (p2 = command; *p2 && isspace(*p2); p2++)
+ ;
- make_local_path(tmp_path, sizeof(tmp_path), "ginge_prep");
- p = tmp_path + strlen(tmp_path);
+ if (*p2 == '.') // relative path?
+ need_ginge = 1;
+ else if (*p2 == '/' && strncmp(p2, "/bin", 4) && strncmp(p2, "/lib", 4)
+ && strncmp(p2, "/sbin", 4) && strncmp(p2, "/usr", 4))
+ // absolute path, but not a system command
+ need_ginge = 1;
p2 = wrap_path(command);
- snprintf(p, sizeof(tmp_path) - (p - tmp_path), " --nomenu %s", p2);
+ if (need_ginge) {
+ make_local_path(tmp_path, sizeof(tmp_path), "ginge_prep");
+ p = tmp_path + strlen(tmp_path);
+
+ snprintf(p, sizeof(tmp_path) - (p - tmp_path), " --nomenu %s", p2);
+ }
+ else
+ snprintf(tmp_path, sizeof(tmp_path), "%s", p2);
wrap_path_free(p2, command);
dbg("system: \"%s\"\n", tmp_path);