From 855b7ab75c305a8d79e21e72d0a00547c9479f3c Mon Sep 17 00:00:00 2001 From: DH Date: Tue, 11 Jul 2023 23:14:33 +0300 Subject: [PATCH] [orbis-kernel] WIP new io device implementation Not used yet --- orbis-kernel/include/orbis/file.hpp | 56 +++++++++++++++++++++++++++++ orbis-kernel/include/orbis/stat.hpp | 26 ++++++++++++++ orbis-kernel/include/orbis/uio.hpp | 29 +++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 orbis-kernel/include/orbis/file.hpp create mode 100644 orbis-kernel/include/orbis/stat.hpp create mode 100644 orbis-kernel/include/orbis/uio.hpp diff --git a/orbis-kernel/include/orbis/file.hpp b/orbis-kernel/include/orbis/file.hpp new file mode 100644 index 000000000..98a0780a2 --- /dev/null +++ b/orbis-kernel/include/orbis/file.hpp @@ -0,0 +1,56 @@ +#pragma once + +#include "KernelAllocator.hpp" +#include "error/ErrorCode.hpp" +#include +#include + +namespace orbis { +struct File; +struct KNote; +struct Thread; +struct Stat; +struct Uio; + +struct FileOps { + std::int32_t flags; + ErrorCode (*ioctl)(File *file, std::uint64_t request, void *argp, + Thread *thread) = nullptr; + ErrorCode (*rdwr)(File *file, Uio *uio, Thread *thread) = nullptr; + ErrorCode (*close)(File *file, Thread *thread) = nullptr; + ErrorCode (*lseek)(File *file, std::uint64_t *offset, std::uint32_t whence, + Thread *thread) = nullptr; + + ErrorCode (*truncate)(File *file, std::uint64_t len, + Thread *thread) = nullptr; + + ErrorCode (*poll)(File *file, std::uint32_t events, Thread *thread) = nullptr; + + ErrorCode (*kqfilter)(File *file, KNote *kn, Thread *thread) = nullptr; + + ErrorCode (*stat)(File *file, Stat *sb, Thread *thread) = nullptr; + + // TODO: chown + // TODO: chmod + + ErrorCode (*mmap)(File *file, void **address, std::uint64_t size, + std::int32_t prot, std::int32_t flags, std::int64_t offset, + Thread *thread) = nullptr; + ErrorCode (*munmap)(File *file, void **address, std::uint64_t size, + Thread *thread) = nullptr; +}; + +struct File { + FileOps *ops; + Ref device; + std::atomic refs{0}; + + void incRef() { refs.fetch_add(1, std::memory_order::acquire); } + + void decRef() { + if (refs.fetch_sub(1, std::memory_order::release) == 1) { + kdelete(this); + } + } +}; +} // namespace orbis diff --git a/orbis-kernel/include/orbis/stat.hpp b/orbis-kernel/include/orbis/stat.hpp new file mode 100644 index 000000000..65f32be90 --- /dev/null +++ b/orbis-kernel/include/orbis/stat.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "orbis-config.hpp" +#include "time.hpp" + +namespace orbis { +struct Stat { + uint32_t dev; // inode's device + uint32_t ino; // inode's number + uint16_t mode; // inode protection mode + uint16_t nlink; // number of hard links + uint32_t uid; // user ID of the file's owner + uint32_t gid; // group ID of the file's group + uint32_t rdev; // device type + timespec atim; // time of last access + timespec mtim; // time of last data modification + timespec ctim; // time of last file status change + off_t size; // file size, in bytes + int64_t blocks; // blocks allocated for file + uint32_t blksize; // optimal blocksize for I/O + uint32_t flags; // user defined flags for file + uint32_t gen; // file generation number + int32_t lspare; + timespec birthtim; // time of file creation +}; +} // namespace orbis diff --git a/orbis-kernel/include/orbis/uio.hpp b/orbis-kernel/include/orbis/uio.hpp new file mode 100644 index 000000000..9ebbe5d16 --- /dev/null +++ b/orbis-kernel/include/orbis/uio.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include + +namespace orbis { +struct IoVec { + void *base; // Base address + std::uint64_t len; // Length +}; + +enum class UioRw : std::uint8_t { Read, Write }; + +// Segment flag values +enum class UioSeg : std::uint8_t { + UserSpace, // from user data space + SysSpace, // from system space + NoCopy // don't copy, already in object +}; + +struct Uio { + std::uint64_t offset; + IoVec *iov; + std::int32_t iovcnt; + std::int32_t resid; + UioSeg segflg; + UioRw rw; + void *td; +}; +} // namespace orbis