aboutsummaryrefslogtreecommitdiff
path: root/fesvr/syscall.cc
diff options
context:
space:
mode:
authorMarcus Comstedt <marcus@mc.pp.se>2019-08-18 16:03:43 +0200
committerMarcus Comstedt <marcus@mc.pp.se>2019-10-28 09:23:32 +0100
commitf437e6a4e9983be0583ee1bf34512f80f3cc0162 (patch)
treef3ac0efc442019566f31aa5ba26c78915e80a0b6 /fesvr/syscall.cc
parent5652b9dd6298c7b61fe80bc2a508bbd3c9e5c5ef (diff)
downloadriscv-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.cc11
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);
}