summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/arm/ArmSemihosting.py4
-rw-r--r--src/arch/arm/semihosting.cc7
-rw-r--r--src/arch/arm/semihosting.hh3
3 files changed, 11 insertions, 3 deletions
diff --git a/src/arch/arm/ArmSemihosting.py b/src/arch/arm/ArmSemihosting.py
index a804aa8ab..6052f1d6b 100644
--- a/src/arch/arm/ArmSemihosting.py
+++ b/src/arch/arm/ArmSemihosting.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 ARM Limited
+# Copyright (c) 2018, 2019 ARM Limited
# All rights reserved.
#
# The license below extends only to copyright in the software and shall
@@ -52,6 +52,8 @@ class ArmSemihosting(SimObject):
"Standard output (stdout for gem5's terminal)")
stderr = Param.String("stderr",
"Standard error (stderr for gem5's terminal)")
+ files_root_dir = Param.String("",
+ "Host root directory for files handled by Semihosting")
mem_reserve = Param.MemorySize("32MB",
"Amount of memory to reserve at the start of the address map. This "
diff --git a/src/arch/arm/semihosting.cc b/src/arch/arm/semihosting.cc
index 2fe5373b8..a0c865d8b 100644
--- a/src/arch/arm/semihosting.cc
+++ b/src/arch/arm/semihosting.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018 ARM Limited
+ * Copyright (c) 2018, 2019 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -138,6 +138,9 @@ ArmSemihosting::ArmSemihosting(const ArmSemihostingParams *p)
timeBase([p]{ struct tm t = p->time; return mkutctime(&t); }()),
tickShift(calcTickShift()),
semiErrno(0),
+ filesRootDir(!p->files_root_dir.empty() &&
+ p->files_root_dir.back() != '/' ?
+ p->files_root_dir + '/' : p->files_root_dir),
stdin(getSTDIO("stdin", p->stdin, "r")),
stdout(getSTDIO("stdout", p->stdout, "w")),
stderr(p->stderr == p->stdout ?
@@ -291,6 +294,8 @@ ArmSemihosting::callOpen(ThreadContext *tc, bool aarch64,
return retError(EINVAL);
std::string fname = readString(tc, name_base, name_size);
+ if (!fname.empty() && fname.front() != '/')
+ fname = filesRootDir + fname;
std::unique_ptr<ArmSemihosting::FileBase> file =
FileBase::create(*this, fname, mode);
diff --git a/src/arch/arm/semihosting.hh b/src/arch/arm/semihosting.hh
index a9c11933f..2ae31827e 100644
--- a/src/arch/arm/semihosting.hh
+++ b/src/arch/arm/semihosting.hh
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018 ARM Limited
+ * Copyright (c) 2018, 2019 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -243,6 +243,7 @@ class ArmSemihosting : public SimObject
FILE *file;
};
+ std::string filesRootDir;
std::vector<std::unique_ptr<FileBase>> files;
FILE *stdin;
FILE *stdout;