/* Construct the envp and argv tables on the target stack. */ target_ulong loader_build_argptr(int envc, int argc, target_ulong sp, target_ulong stringp, int push_ptr) { int n = sizeof(target_ulong); target_ulong envp; target_ulong argv; sp -= (envc + 1) * n; envp = sp; sp -= (argc + 1) * n; argv = sp; if (push_ptr) { sp -= n; tputl(sp, envp); sp -= n; tputl(sp, argv); } sp -= n; tputl(sp, argc); while (argc-- > 0) { tputl(argv, stringp); argv += n; stringp += target_strlen(stringp) + 1; } tputl(argv, 0); while (envc-- > 0) { tputl(envp, stringp); envp += n; stringp += target_strlen(stringp) + 1; } tputl(envp, 0); return sp; }
/* Construct the envp and argv tables on the target stack. */ abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp, abi_ulong stringp, int push_ptr) { CPUArchState *env = thread_cpu->env_ptr; TaskState *ts = (TaskState *)env->opaque; int n = sizeof(abi_ulong); abi_ulong envp; abi_ulong argv; sp -= (envc + 1) * n; envp = sp; sp -= (argc + 1) * n; argv = sp; if (push_ptr) { /* FIXME - handle put_user() failures */ sp -= n; put_user_ual(envp, sp); sp -= n; put_user_ual(argv, sp); } sp -= n; /* FIXME - handle put_user() failures */ put_user_ual(argc, sp); #ifdef CONFIG_QTRACE_TAINT qtrace_taint_memory(env, sp, sizeof(target_ulong), QTRACE_TAINT_LABEL_ARG); #endif ts->info->arg_start = stringp; while (argc-- > 0) { /* FIXME - handle put_user() failures */ put_user_ual(stringp, argv); #ifdef CONFIG_QTRACE_TAINT qtrace_taint_memory(env, argv, target_strlen(stringp), QTRACE_TAINT_LABEL_ARG); #endif argv += n; stringp += target_strlen(stringp) + 1; } ts->info->arg_end = stringp; /* FIXME - handle put_user() failures */ put_user_ual(0, argv); while (envc-- > 0) { /* FIXME - handle put_user() failures */ put_user_ual(stringp, envp); #ifdef CONFIG_QTRACE_TAINT qtrace_taint_memory(env, envp, target_strlen(stringp), QTRACE_TAINT_LABEL_ENV); #endif envp += n; stringp += target_strlen(stringp) + 1; } /* FIXME - handle put_user() failures */ put_user_ual(0, envp); return sp; }
/* Construct the envp and argv tables on the target stack. */ abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp, abi_ulong stringp, int push_ptr) { TaskState *ts = (TaskState *)thread_cpu->opaque; int n = sizeof(abi_ulong); abi_ulong envp; abi_ulong argv; sp -= (envc + 1) * n; envp = sp; sp -= (argc + 1) * n; argv = sp; if (push_ptr) { /* FIXME - handle put_user() failures */ sp -= n; put_user_ual(envp, sp); sp -= n; put_user_ual(argv, sp); } sp -= n; /* FIXME - handle put_user() failures */ put_user_ual(argc, sp); ts->info->arg_start = stringp; while (argc-- > 0) { /* FIXME - handle put_user() failures */ put_user_ual(stringp, argv); argv += n; stringp += target_strlen(stringp) + 1; } ts->info->arg_end = stringp; /* FIXME - handle put_user() failures */ put_user_ual(0, argv); while (envc-- > 0) { /* FIXME - handle put_user() failures */ put_user_ual(stringp, envp); envp += n; stringp += target_strlen(stringp) + 1; } /* FIXME - handle put_user() failures */ put_user_ual(0, envp); return sp; }
/* Like lock_user but for null terminated strings. */ uint32_t *lock_user_string(ProgramBase *prog, uint32_t guest_addr) { uint32_t len; len = target_strlen(prog, guest_addr); if (len < 0) return NULL; return lock_user(prog, guest_addr,(len + 1)); }
/* Construct the envp and argv tables on the target stack. */ abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp, abi_ulong stringp, int push_ptr) { int n = sizeof(abi_ulong); abi_ulong envp; abi_ulong argv; sp -= (envc + 1) * n; envp = sp; sp -= (argc + 1) * n; argv = sp; if (push_ptr) { /* FIXME - handle put_user() failures */ sp -= n; put_user_ual(envp, sp); sp -= n; put_user_ual(argv, sp); } sp -= n; /* FIXME - handle put_user() failures */ put_user_ual(argc, sp); while (argc-- > 0) { /* FIXME - handle put_user() failures */ put_user_ual(stringp, argv); argv += n; stringp += target_strlen(stringp) + 1; } /* FIXME - handle put_user() failures */ put_user_ual(0, argv); while (envc-- > 0) { /* FIXME - handle put_user() failures */ put_user_ual(stringp, envp); envp += n; stringp += target_strlen(stringp) + 1; } /* FIXME - handle put_user() failures */ put_user_ual(0, envp); return sp; }