From: Jacob Lifshay Date: Mon, 4 Dec 2023 10:15:47 +0000 (-0800) Subject: caller.py: implement writev syscall X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9567c11344d2083244d407cb40d19fa9dcfb9602;p=openpower-isa.git caller.py: implement writev syscall --- diff --git a/src/openpower/decoder/isa/caller.py b/src/openpower/decoder/isa/caller.py index fd0a60fe..e14fa843 100644 --- a/src/openpower/decoder/isa/caller.py +++ b/src/openpower/decoder/isa/caller.py @@ -1186,6 +1186,29 @@ class SyscallEmulator(openpower.syscalls.Dispatcher): except OSError as e: return -e.errno + def sys_writev(self, fd, iov, iovcnt, *rest): + IOV_MAX = 1024 + if iovcnt < 0 or iovcnt > IOV_MAX: + return -errno.EINVAL + struct_iovec = struct.Struct(" 0: + iov = self.__isacaller.mem.get_ctypes( + iov, struct_iovec.size * iovcnt, is_write=False) + iov = list(struct_iovec.iter_unpack(iov)) + else: + iov = [] + for i, iovec in enumerate(iov): + iov_base, iov_len = iovec + iov[i] = self.__isacaller.mem.get_ctypes( + iov_base, iov_len, is_write=False) + except (ValueError, MemException): + return -errno.EFAULT + try: + return os.writev(fd, iov) + except OSError as e: + return -e.errno + def sys_read(self, fd, buf, count, *rest): buf = self.__isacaller.mem.get_ctypes(buf, count, is_write=True) try: