diff options
author | Marcus Comstedt <marcus@mc.pp.se> | 2019-08-18 16:03:43 +0200 |
---|---|---|
committer | Marcus Comstedt <marcus@mc.pp.se> | 2019-10-28 09:23:32 +0100 |
commit | f437e6a4e9983be0583ee1bf34512f80f3cc0162 (patch) | |
tree | f3ac0efc442019566f31aa5ba26c78915e80a0b6 /fesvr/syscall.cc | |
parent | 5652b9dd6298c7b61fe80bc2a508bbd3c9e5c5ef (diff) | |
download | riscv-isa-sim-f437e6a4e9983be0583ee1bf34512f80f3cc0162.zip riscv-isa-sim-f437e6a4e9983be0583ee1bf34512f80f3cc0162.tar.gz riscv-isa-sim-f437e6a4e9983be0583ee1bf34512f80f3cc0162.tar.bz2 |
Implement support for big-endian hosts
Diffstat (limited to 'fesvr/syscall.cc')
-rw-r--r-- | fesvr/syscall.cc | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/fesvr/syscall.cc b/fesvr/syscall.cc index 6e8baf6..f0bdd25 100644 --- a/fesvr/syscall.cc +++ b/fesvr/syscall.cc @@ -2,6 +2,7 @@ #include "syscall.h" #include "htif.h" +#include "byteorder.h" #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> @@ -299,21 +300,21 @@ reg_t syscall_t::sys_getmainvars(reg_t pbuf, reg_t limit, reg_t a2, reg_t a3, re { std::vector<std::string> args = htif->target_args(); std::vector<uint64_t> words(args.size() + 3); - words[0] = args.size(); + words[0] = to_le(args.size()); words[args.size()+1] = 0; // argv[argc] = NULL words[args.size()+2] = 0; // envp[0] = NULL size_t sz = (args.size() + 3) * sizeof(words[0]); for (size_t i = 0; i < args.size(); i++) { - words[i+1] = sz + pbuf; + words[i+1] = to_le(sz + pbuf); sz += args[i].length() + 1; } std::vector<char> bytes(sz); memcpy(&bytes[0], &words[0], sizeof(words[0]) * words.size()); for (size_t i = 0; i < args.size(); i++) - strcpy(&bytes[words[i+1] - pbuf], args[i].c_str()); + strcpy(&bytes[from_le(words[i+1]) - pbuf], args[i].c_str()); if (bytes.size() > limit) return -ENOMEM; @@ -342,11 +343,11 @@ void syscall_t::dispatch(reg_t mm) reg_t magicmem[8]; memif->read(mm, sizeof(magicmem), magicmem); - reg_t n = magicmem[0]; + reg_t n = from_le(magicmem[0]); if (n >= table.size() || !table[n]) throw std::runtime_error("bad syscall #" + std::to_string(n)); - magicmem[0] = (this->*table[n])(magicmem[1], magicmem[2], magicmem[3], magicmem[4], magicmem[5], magicmem[6], magicmem[7]); + magicmem[0] = to_le((this->*table[n])(from_le(magicmem[1]), from_le(magicmem[2]), from_le(magicmem[3]), from_le(magicmem[4]), from_le(magicmem[5]), from_le(magicmem[6]), from_le(magicmem[7]))); memif->write(mm, sizeof(magicmem), magicmem); } |