arch-arm: Semihosting, specify files root dir
authorAdrian Herrera <adrian.herrera@arm.com>
Fri, 15 Nov 2019 10:55:36 +0000 (10:55 +0000)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Mon, 6 Jan 2020 18:54:41 +0000 (18:54 +0000)
This patch adds an option to "ArmSemihosting" which allows for
specifying an optional search path for host files.
Previously, behaviour was fixed to search in the directory from where
the gem5 binary was run from.

Change-Id: I57b932b38d022f132af78857104633d7bfdd1442
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/23903
Reviewed-by: Ciro Santilli <ciro.santilli@arm.com>
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/arm/ArmSemihosting.py
src/arch/arm/semihosting.cc
src/arch/arm/semihosting.hh

index a804aa8ab18c5322600febcbac4f5d67b0b7fa8c..6052f1d6b1088f554304e61f11ddb1ec62284d02 100644 (file)
@@ -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 "
index 2fe5373b85381a9b16c208ff4710ddd5cc919e79..a0c865d8bcdc081896582395462fee6752d40827 100644 (file)
@@ -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);
index a9c11933fea79c77b9d0907ae6fe35af2c674786..2ae31827ef13ae9feb657eaee7e89e8583b725aa 100644 (file)
@@ -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;