mirror of https://github.com/xemu-project/xemu.git
Merge remote-tracking branch 'riku/linux-user-for-upstream' into staging
* riku/linux-user-for-upstream: linux-user: fix emulation of /proc/self/maps linux-user: Clean up interim solution for exit syscall
This commit is contained in:
commit
233ffa1653
|
@ -4866,13 +4866,53 @@ int get_osversion(void)
|
||||||
|
|
||||||
static int open_self_maps(void *cpu_env, int fd)
|
static int open_self_maps(void *cpu_env, int fd)
|
||||||
{
|
{
|
||||||
|
#if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32)
|
||||||
TaskState *ts = ((CPUArchState *)cpu_env)->opaque;
|
TaskState *ts = ((CPUArchState *)cpu_env)->opaque;
|
||||||
|
#endif
|
||||||
|
FILE *fp;
|
||||||
|
char *line = NULL;
|
||||||
|
size_t len = 0;
|
||||||
|
ssize_t read;
|
||||||
|
|
||||||
|
fp = fopen("/proc/self/maps", "r");
|
||||||
|
if (fp == NULL) {
|
||||||
|
return -EACCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((read = getline(&line, &len, fp)) != -1) {
|
||||||
|
int fields, dev_maj, dev_min, inode;
|
||||||
|
uint64_t min, max, offset;
|
||||||
|
char flag_r, flag_w, flag_x, flag_p;
|
||||||
|
char path[512] = "";
|
||||||
|
fields = sscanf(line, "%"PRIx64"-%"PRIx64" %c%c%c%c %"PRIx64" %x:%x %d"
|
||||||
|
" %512s", &min, &max, &flag_r, &flag_w, &flag_x,
|
||||||
|
&flag_p, &offset, &dev_maj, &dev_min, &inode, path);
|
||||||
|
|
||||||
|
if ((fields < 10) || (fields > 11)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!strncmp(path, "[stack]", 7)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (h2g_valid(min) && h2g_valid(max)) {
|
||||||
|
dprintf(fd, TARGET_ABI_FMT_lx "-" TARGET_ABI_FMT_lx
|
||||||
|
" %c%c%c%c %08" PRIx64 " %02x:%02x %d%s%s\n",
|
||||||
|
h2g(min), h2g(max), flag_r, flag_w,
|
||||||
|
flag_x, flag_p, offset, dev_maj, dev_min, inode,
|
||||||
|
path[0] ? " " : "", path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(line);
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
#if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32)
|
||||||
dprintf(fd, "%08llx-%08llx rw-p %08llx 00:00 0 [stack]\n",
|
dprintf(fd, "%08llx-%08llx rw-p %08llx 00:00 0 [stack]\n",
|
||||||
(unsigned long long)ts->info->stack_limit,
|
(unsigned long long)ts->info->stack_limit,
|
||||||
(unsigned long long)(ts->stack_base + (TARGET_PAGE_SIZE - 1))
|
(unsigned long long)(ts->stack_base + (TARGET_PAGE_SIZE - 1))
|
||||||
& TARGET_PAGE_MASK,
|
& TARGET_PAGE_MASK,
|
||||||
(unsigned long long)ts->stack_base);
|
(unsigned long long)0);
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -5045,11 +5085,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||||
NULL, NULL, 0);
|
NULL, NULL, 0);
|
||||||
}
|
}
|
||||||
thread_env = NULL;
|
thread_env = NULL;
|
||||||
#ifdef ENV_GET_CPU
|
|
||||||
object_delete(OBJECT(ENV_GET_CPU(cpu_env)));
|
object_delete(OBJECT(ENV_GET_CPU(cpu_env)));
|
||||||
#else
|
|
||||||
g_free(cpu_env);
|
|
||||||
#endif
|
|
||||||
g_free(ts);
|
g_free(ts);
|
||||||
pthread_exit(NULL);
|
pthread_exit(NULL);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue