diff options
author | Nathan Binkert <binkertn@umich.edu> | 2004-07-01 18:03:05 -0400 |
---|---|---|
committer | Nathan Binkert <binkertn@umich.edu> | 2004-07-01 18:03:05 -0400 |
commit | 6083c8280b3042ddbdbdfc3868a26bd69712d4d7 (patch) | |
tree | 80d5939bade827802d5c4dc2bc60d583fdd2aaaa /arch/alpha/pseudo_inst.cc | |
parent | 671cff59372695309b62f2a4f6aa68269f56584a (diff) | |
download | gem5-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.cc | 42 |
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: |