diff options
author | Andrew Waterman <andrew@sifive.com> | 2024-03-22 14:00:45 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-22 14:00:45 -0700 |
commit | 4f84dd2627199a16e9eaabb614842139f53a132a (patch) | |
tree | d5b0b6ec530f265b39efa1aa156f2d3b4f394178 | |
parent | 534fe05b836d7420ae45c2b2faaf27891d20b50b (diff) | |
parent | 1a17adb7ba41366359964a26a8403b6dbe7b64cb (diff) | |
download | spike-4f84dd2627199a16e9eaabb614842139f53a132a.zip spike-4f84dd2627199a16e9eaabb614842139f53a132a.tar.gz spike-4f84dd2627199a16e9eaabb614842139f53a132a.tar.bz2 |
Merge pull request #1631 from mylai-mtk/sys-readlinkat
Implement syscall readlinkat
-rw-r--r-- | fesvr/syscall.cc | 14 | ||||
-rw-r--r-- | fesvr/syscall.h | 1 |
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 |