mirror of
https://github.com/RGBCube/serenity
synced 2025-07-23 20:17:42 +00:00
UserspaceEmulator: Transfer the environment to the emulated process
This commit is contained in:
parent
1366557094
commit
f097ed6ada
3 changed files with 22 additions and 8 deletions
|
@ -62,17 +62,17 @@ Emulator& Emulator::the()
|
||||||
return *s_the;
|
return *s_the;
|
||||||
}
|
}
|
||||||
|
|
||||||
Emulator::Emulator(const Vector<String>& arguments, NonnullRefPtr<ELF::Loader> elf)
|
Emulator::Emulator(const Vector<String>& arguments, const Vector<String>& environment, NonnullRefPtr<ELF::Loader> elf)
|
||||||
: m_elf(move(elf))
|
: m_elf(move(elf))
|
||||||
, m_cpu(*this)
|
, m_cpu(*this)
|
||||||
{
|
{
|
||||||
m_malloc_tracer = make<MallocTracer>();
|
m_malloc_tracer = make<MallocTracer>();
|
||||||
ASSERT(!s_the);
|
ASSERT(!s_the);
|
||||||
s_the = this;
|
s_the = this;
|
||||||
setup_stack(arguments);
|
setup_stack(arguments, environment);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Emulator::setup_stack(const Vector<String>& arguments)
|
void Emulator::setup_stack(const Vector<String>& arguments, const Vector<String>& environment)
|
||||||
{
|
{
|
||||||
auto stack_region = make<SimpleRegion>(stack_location, stack_size);
|
auto stack_region = make<SimpleRegion>(stack_location, stack_size);
|
||||||
stack_region->set_stack(true);
|
stack_region->set_stack(true);
|
||||||
|
@ -86,7 +86,16 @@ void Emulator::setup_stack(const Vector<String>& arguments)
|
||||||
argv_entries.append(m_cpu.esp().value());
|
argv_entries.append(m_cpu.esp().value());
|
||||||
}
|
}
|
||||||
|
|
||||||
m_cpu.push32(shadow_wrap_as_initialized<u32>(0)); // char** envp = { nullptr }
|
Vector<u32> env_entries;
|
||||||
|
|
||||||
|
for (auto& variable : environment) {
|
||||||
|
m_cpu.push_string(variable.characters());
|
||||||
|
env_entries.append(m_cpu.esp().value());
|
||||||
|
}
|
||||||
|
|
||||||
|
m_cpu.push32(shadow_wrap_as_initialized<u32>(0)); // char** envp = { envv_entries..., nullptr }
|
||||||
|
for (ssize_t i = env_entries.size() - 1; i >= 0; --i)
|
||||||
|
m_cpu.push32(shadow_wrap_as_initialized(env_entries[i]));
|
||||||
u32 envp = m_cpu.esp().value();
|
u32 envp = m_cpu.esp().value();
|
||||||
|
|
||||||
m_cpu.push32(shadow_wrap_as_initialized<u32>(0)); // char** argv = { argv_entries..., nullptr }
|
m_cpu.push32(shadow_wrap_as_initialized<u32>(0)); // char** argv = { argv_entries..., nullptr }
|
||||||
|
|
|
@ -43,7 +43,7 @@ class Emulator {
|
||||||
public:
|
public:
|
||||||
static Emulator& the();
|
static Emulator& the();
|
||||||
|
|
||||||
Emulator(const Vector<String>& arguments, NonnullRefPtr<ELF::Loader>);
|
Emulator(const Vector<String>& arguments, const Vector<String>& environment, NonnullRefPtr<ELF::Loader>);
|
||||||
|
|
||||||
bool load_elf();
|
bool load_elf();
|
||||||
void dump_backtrace();
|
void dump_backtrace();
|
||||||
|
@ -68,7 +68,7 @@ private:
|
||||||
|
|
||||||
OwnPtr<MallocTracer> m_malloc_tracer;
|
OwnPtr<MallocTracer> m_malloc_tracer;
|
||||||
|
|
||||||
void setup_stack(const Vector<String>& arguments);
|
void setup_stack(const Vector<String>& arguments, const Vector<String>& environment);
|
||||||
|
|
||||||
int virt$get_dir_entries(int fd, FlatPtr buffer, ssize_t);
|
int virt$get_dir_entries(int fd, FlatPtr buffer, ssize_t);
|
||||||
int virt$ioctl(int fd, unsigned, FlatPtr);
|
int virt$ioctl(int fd, unsigned, FlatPtr);
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
#include <LibELF/Loader.h>
|
#include <LibELF/Loader.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv, char** env)
|
||||||
{
|
{
|
||||||
if (argc == 1) {
|
if (argc == 1) {
|
||||||
out() << "usage: UserspaceEmulator <command>";
|
out() << "usage: UserspaceEmulator <command>";
|
||||||
|
@ -55,7 +55,12 @@ int main(int argc, char** argv)
|
||||||
arguments.append(argv[i]);
|
arguments.append(argv[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
UserspaceEmulator::Emulator emulator(arguments, move(elf));
|
Vector<String> environment;
|
||||||
|
for (int i = 0; env[i]; ++i) {
|
||||||
|
environment.append(env[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
UserspaceEmulator::Emulator emulator(arguments, environment, move(elf));
|
||||||
if (!emulator.load_elf())
|
if (!emulator.load_elf())
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue