summaryrefslogtreecommitdiff
path: root/arch/alpha/pseudo_inst.cc
diff options
context:
space:
mode:
authorNathan Binkert <binkertn@umich.edu>2004-07-01 18:03:05 -0400
committerNathan Binkert <binkertn@umich.edu>2004-07-01 18:03:05 -0400
commit6083c8280b3042ddbdbdfc3868a26bd69712d4d7 (patch)
tree80d5939bade827802d5c4dc2bc60d583fdd2aaaa /arch/alpha/pseudo_inst.cc
parent671cff59372695309b62f2a4f6aa68269f56584a (diff)
downloadgem5-6083c8280b3042ddbdbdfc3868a26bd69712d4d7.tar.xz
implement the readfile pseudo instruction that will read
a realworld file. arch/alpha/isa_desc: arch/alpha/pseudo_inst.hh: implement the readfile pseudo instruction that will read a chunk of a realworld file. arch/alpha/pseudo_inst.cc: implement the readfile pseudo instruction that will read a chunk of a realworld file. The filename is a per system parameter and comes from the system itself. kern/linux/linux_system.cc: sim/system.hh: Create a per-system readfile parameter for use by the readfile pseudo instruction. That way each system can get its own file. --HG-- extra : convert_revision : 941b3a3e20702a6252b219ca66a6d90da2944c50
Diffstat (limited to 'arch/alpha/pseudo_inst.cc')
-rw-r--r--arch/alpha/pseudo_inst.cc42
1 files changed, 42 insertions, 0 deletions
diff --git a/arch/alpha/pseudo_inst.cc b/arch/alpha/pseudo_inst.cc
index f4201ab09..e23dc8baa 100644
--- a/arch/alpha/pseudo_inst.cc
+++ b/arch/alpha/pseudo_inst.cc
@@ -26,15 +26,20 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include <fcntl.h>
+#include <cstdio>
#include <string>
#include "arch/alpha/pseudo_inst.hh"
+#include "arch/alpha/vtophys.hh"
+#include "cpu/base_cpu.hh"
#include "cpu/exec_context.hh"
#include "sim/param.hh"
#include "sim/serialize.hh"
#include "sim/sim_exit.hh"
#include "sim/stat_control.hh"
#include "sim/stats.hh"
+#include "sim/system.hh"
using namespace std;
using namespace Stats;
@@ -149,6 +154,43 @@ namespace AlphaPseudo
Checkpoint::setup(when, repeat);
}
+ void
+ readfile(ExecContext *xc)
+ {
+ const string &file = xc->cpu->system->readfile;
+ if (file.empty()) {
+ xc->regs.intRegFile[0] = ULL(0);
+ return;
+ }
+
+ Addr vaddr = xc->regs.intRegFile[16];
+ uint64_t len = xc->regs.intRegFile[17];
+ uint64_t offset = xc->regs.intRegFile[18];
+ uint64_t result = 0;
+
+ int fd = ::open(file.c_str(), O_RDONLY, 0);
+ if (fd < 0)
+ panic("could not open file %s\n", file);
+
+ char *buf = new char[len];
+ char *p = buf;
+ while (len > 0) {
+ int bytes = ::pread(fd, p, len, offset);
+ if (bytes <= 0)
+ break;
+
+ p += bytes;
+ offset += bytes;
+ result += bytes;
+ len -= bytes;
+ }
+
+ close(fd);
+ CopyIn(xc, vaddr, buf, result);
+ delete [] buf;
+ xc->regs.intRegFile[0] = result;
+ }
+
class Context : public ParamContext
{
public: