aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2024-03-22 14:00:45 -0700
committerGitHub <noreply@github.com>2024-03-22 14:00:45 -0700
commit4f84dd2627199a16e9eaabb614842139f53a132a (patch)
treed5b0b6ec530f265b39efa1aa156f2d3b4f394178
parent534fe05b836d7420ae45c2b2faaf27891d20b50b (diff)
parent1a17adb7ba41366359964a26a8403b6dbe7b64cb (diff)
downloadriscv-isa-sim-4f84dd2627199a16e9eaabb614842139f53a132a.zip
riscv-isa-sim-4f84dd2627199a16e9eaabb614842139f53a132a.tar.gz
riscv-isa-sim-4f84dd2627199a16e9eaabb614842139f53a132a.tar.bz2
Merge pull request #1631 from mylai-mtk/sys-readlinkat
Implement syscall readlinkat
-rw-r--r--fesvr/syscall.cc14
-rw-r--r--fesvr/syscall.h1
2 files changed, 15 insertions, 0 deletions
diff --git a/fesvr/syscall.cc b/fesvr/syscall.cc
index e277be1..162cbfc 100644
--- a/fesvr/syscall.cc
+++ b/fesvr/syscall.cc
@@ -161,6 +161,7 @@ syscall_t::syscall_t(htif_t* htif)
table[64] = &syscall_t::sys_write;
table[67] = &syscall_t::sys_pread;
table[68] = &syscall_t::sys_pwrite;
+ table[78] = &syscall_t::sys_readlinkat;
table[79] = &syscall_t::sys_fstatat;
table[80] = &syscall_t::sys_fstat;
table[93] = &syscall_t::sys_exit;
@@ -512,3 +513,16 @@ void syscall_t::set_chroot(const char* where)
chroot = buf2;
}
+
+reg_t syscall_t::sys_readlinkat(reg_t dirfd, reg_t ppathname, reg_t ppathname_size,
+ reg_t pbuf, reg_t bufsiz, reg_t a5, reg_t a6)
+{
+ std::vector<char> pathname(ppathname_size);
+ memif->read(ppathname, ppathname_size, pathname.data());
+
+ std::vector<char> buf(bufsiz);
+ ssize_t ret = sysret_errno(AT_SYSCALL(readlinkat, dirfd, pathname.data(), buf.data(), bufsiz));
+ if (ret > 0)
+ memif->write(pbuf, ret, buf.data());
+ return ret;
+}
diff --git a/fesvr/syscall.h b/fesvr/syscall.h
index c002e6c..f711170 100644
--- a/fesvr/syscall.h
+++ b/fesvr/syscall.h
@@ -70,6 +70,7 @@ class syscall_t : public device_t
reg_t sys_getcwd(reg_t, reg_t, reg_t, reg_t, reg_t, reg_t, reg_t);
reg_t sys_getmainvars(reg_t, reg_t, reg_t, reg_t, reg_t, reg_t, reg_t);
reg_t sys_chdir(reg_t, reg_t, reg_t, reg_t, reg_t, reg_t, reg_t);
+ reg_t sys_readlinkat(reg_t, reg_t, reg_t, reg_t, reg_t, reg_t, reg_t);
};
#endif