Browse Source

Fix byteorder issues with struct riscv_stat (#596)

pull/602/head
Marcus Comstedt 6 years ago
committed by GitHub
parent
commit
a4994cba0d
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 71
      fesvr/syscall.cc

71
fesvr/syscall.cc

@ -19,34 +19,42 @@ using namespace std::placeholders;
struct riscv_stat
{
uint64_t dev;
uint64_t ino;
uint32_t mode;
uint32_t nlink;
uint32_t uid;
uint32_t gid;
uint64_t rdev;
uint64_t __pad1;
uint64_t size;
uint32_t blksize;
uint32_t __pad2;
uint64_t blocks;
uint64_t atime;
uint64_t __pad3;
uint64_t mtime;
uint64_t __pad4;
uint64_t ctime;
uint64_t __pad5;
uint32_t __unused4;
uint32_t __unused5;
riscv_stat(const struct stat& s)
: dev(s.st_dev), ino(s.st_ino), mode(s.st_mode), nlink(s.st_nlink),
uid(s.st_uid), gid(s.st_gid), rdev(s.st_rdev), __pad1(0),
size(s.st_size), blksize(s.st_blksize), __pad2(0),
blocks(s.st_blocks), atime(s.st_atime), __pad3(0),
mtime(s.st_mtime), __pad4(0), ctime(s.st_ctime), __pad5(0),
__unused4(0), __unused5(0) {}
target_endian<uint64_t> dev;
target_endian<uint64_t> ino;
target_endian<uint32_t> mode;
target_endian<uint32_t> nlink;
target_endian<uint32_t> uid;
target_endian<uint32_t> gid;
target_endian<uint64_t> rdev;
target_endian<uint64_t> __pad1;
target_endian<uint64_t> size;
target_endian<uint32_t> blksize;
target_endian<uint32_t> __pad2;
target_endian<uint64_t> blocks;
target_endian<uint64_t> atime;
target_endian<uint64_t> __pad3;
target_endian<uint64_t> mtime;
target_endian<uint64_t> __pad4;
target_endian<uint64_t> ctime;
target_endian<uint64_t> __pad5;
target_endian<uint32_t> __unused4;
target_endian<uint32_t> __unused5;
riscv_stat(const struct stat& s, htif_t* htif)
: dev(htif->to_target<uint64_t>(s.st_dev)),
ino(htif->to_target<uint64_t>(s.st_ino)),
mode(htif->to_target<uint32_t>(s.st_mode)),
nlink(htif->to_target<uint32_t>(s.st_nlink)),
uid(htif->to_target<uint32_t>(s.st_uid)),
gid(htif->to_target<uint32_t>(s.st_gid)),
rdev(htif->to_target<uint64_t>(s.st_rdev)), __pad1(),
size(htif->to_target<uint64_t>(s.st_size)),
blksize(htif->to_target<uint32_t>(s.st_blksize)), __pad2(),
blocks(htif->to_target<uint64_t>(s.st_blocks)),
atime(htif->to_target<uint64_t>(s.st_atime)), __pad3(),
mtime(htif->to_target<uint64_t>(s.st_mtime)), __pad4(),
ctime(htif->to_target<uint64_t>(s.st_ctime)), __pad5(),
__unused4(), __unused5() {}
};
syscall_t::syscall_t(htif_t* htif)
@ -183,7 +191,7 @@ reg_t syscall_t::sys_fstat(reg_t fd, reg_t pbuf, reg_t a2, reg_t a3, reg_t a4, r
reg_t ret = sysret_errno(fstat(fds.lookup(fd), &buf));
if (ret != (reg_t)-1)
{
riscv_stat rbuf(buf);
riscv_stat rbuf(buf, htif);
memif->write(pbuf, sizeof(rbuf), &rbuf);
}
return ret;
@ -206,10 +214,9 @@ reg_t syscall_t::sys_lstat(reg_t pname, reg_t len, reg_t pbuf, reg_t a3, reg_t a
struct stat buf;
reg_t ret = sysret_errno(lstat(do_chroot(&name[0]).c_str(), &buf));
riscv_stat rbuf(buf);
if (ret != (reg_t)-1)
{
riscv_stat rbuf(buf);
riscv_stat rbuf(buf, htif);
memif->write(pbuf, sizeof(rbuf), &rbuf);
}
return ret;
@ -237,7 +244,7 @@ reg_t syscall_t::sys_fstatat(reg_t dirfd, reg_t pname, reg_t len, reg_t pbuf, re
reg_t ret = sysret_errno(AT_SYSCALL(fstatat, dirfd, &name[0], &buf, flags));
if (ret != (reg_t)-1)
{
riscv_stat rbuf(buf);
riscv_stat rbuf(buf, htif);
memif->write(pbuf, sizeof(rbuf), &rbuf);
}
return ret;

Loading…
Cancel
Save