summaryrefslogtreecommitdiff
path: root/src/sim/process.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/sim/process.cc')
-rw-r--r--src/sim/process.cc19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/sim/process.cc b/src/sim/process.cc
index 913e9298d..15dc8c3e8 100644
--- a/src/sim/process.cc
+++ b/src/sim/process.cc
@@ -278,7 +278,7 @@ Process::alloc_fd(int sim_fd, string filename, int flags, int mode, bool pipe)
// find first free target fd
for (int free_fd = 0; free_fd <= MAX_FD; ++free_fd) {
Process::FdMap *fdo = &fd_map[free_fd];
- if (fdo->fd == -1) {
+ if (fdo->fd == -1 && fdo->driver == NULL) {
fdo->fd = sim_fd;
fdo->filename = filename;
fdo->mode = mode;
@@ -309,6 +309,7 @@ Process::free_fd(int tgt_fd)
fdo->flags = 0;
fdo->isPipe = false;
fdo->readPipeSource = 0;
+ fdo->driver = NULL;
}
@@ -567,7 +568,8 @@ Process::map(Addr vaddr, Addr paddr, int size)
LiveProcess::LiveProcess(LiveProcessParams * params, ObjectFile *_objFile)
: Process(params), objFile(_objFile),
- argv(params->cmd), envp(params->env), cwd(params->cwd)
+ argv(params->cmd), envp(params->env), cwd(params->cwd),
+ drivers(params->drivers)
{
__uid = params->uid;
__euid = params->euid;
@@ -608,6 +610,19 @@ LiveProcess::getSyscallArg(ThreadContext *tc, int &i, int width)
return getSyscallArg(tc, i);
}
+
+EmulatedDriver *
+LiveProcess::findDriver(std::string filename)
+{
+ for (EmulatedDriver *d : drivers) {
+ if (d->match(filename))
+ return d;
+ }
+
+ return NULL;
+}
+
+
LiveProcess *
LiveProcess::create(LiveProcessParams * params)
{