Skip to content

Commit

Permalink
Kernel+LibC: Turn errno codes into a strongly typed enum
Browse files Browse the repository at this point in the history
..and allow implicit creation of KResult and KResultOr from ErrnoCode.
This means that kernel functions that return those types can finally
do "return EINVAL;" and it will just work.

There's a handful of functions that still deal with signed integers
that should be converted to return KResults.
  • Loading branch information
awesomekling committed Jan 20, 2021
1 parent e279b45 commit 19d3f8c
Show file tree
Hide file tree
Showing 48 changed files with 591 additions and 506 deletions.
2 changes: 1 addition & 1 deletion Kernel/Console.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ Kernel::KResultOr<size_t> Console::write(Kernel::FileDescription&, size_t, const
return (ssize_t)bytes_count;
});
if (nread < 0)
return Kernel::KResult(nread);
return Kernel::KResult((ErrnoCode)-nread);
return (size_t)nread;
}

Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/BXVGADevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -179,12 +179,12 @@ KResultOr<Region*> BXVGADevice::mmap(Process& process, FileDescription&, Virtual
{
REQUIRE_PROMISE(video);
if (!shared)
return KResult(-ENODEV);
return ENODEV;
ASSERT(offset == 0);
ASSERT(size == framebuffer_size_in_bytes());
auto vmobject = AnonymousVMObject::create_for_physical_range(m_framebuffer_address, framebuffer_size_in_bytes());
if (!vmobject)
return KResult(-ENOMEM);
return ENOMEM;
return process.allocate_region_with_vmobject(
preferred_vaddr,
framebuffer_size_in_bytes(),
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/FullDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,15 +50,15 @@ KResultOr<size_t> FullDevice::read(FileDescription&, size_t, UserOrKernelBuffer&
{
ssize_t count = min(static_cast<size_t>(PAGE_SIZE), size);
if (!buffer.memset(0, count))
return KResult(-EFAULT);
return EFAULT;
return count;
}

KResultOr<size_t> FullDevice::write(FileDescription&, size_t, const UserOrKernelBuffer&, size_t size)
{
if (size == 0)
return 0;
return KResult(-ENOSPC);
return ENOSPC;
}

}
2 changes: 1 addition & 1 deletion Kernel/Devices/KeyboardDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ KResultOr<size_t> KeyboardDevice::read(FileDescription&, size_t, UserOrKernelBuf
return (ssize_t)data_bytes;
});
if (n < 0)
return KResult(n);
return KResult((ErrnoCode)-n);
ASSERT((size_t)n == sizeof(Event));
nread += sizeof(Event);

Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/MBVGADevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,12 @@ KResultOr<Region*> MBVGADevice::mmap(Process& process, FileDescription&, Virtual
{
REQUIRE_PROMISE(video);
if (!shared)
return KResult(-ENODEV);
return ENODEV;
ASSERT(offset == 0);
ASSERT(size == framebuffer_size_in_bytes());
auto vmobject = AnonymousVMObject::create_for_physical_range(m_framebuffer_address, framebuffer_size_in_bytes());
if (!vmobject)
return KResult(-ENOMEM);
return ENOMEM;
return process.allocate_region_with_vmobject(
preferred_vaddr,
framebuffer_size_in_bytes(),
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Devices/PS2MouseDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ KResultOr<size_t> PS2MouseDevice::read(FileDescription&, size_t, UserOrKernelBuf
#endif
size_t bytes_read_from_packet = min(remaining_space_in_buffer, sizeof(MousePacket));
if (!buffer.write(&packet, nread, bytes_read_from_packet))
return KResult(-EFAULT);
return EFAULT;
nread += bytes_read_from_packet;
remaining_space_in_buffer -= bytes_read_from_packet;

Expand Down
2 changes: 1 addition & 1 deletion Kernel/Devices/RandomDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ KResultOr<size_t> RandomDevice::read(FileDescription&, size_t, UserOrKernelBuffe
return (ssize_t)data_size;
});
if (!success)
return KResult(-EFAULT);
return EFAULT;
return size;
}

Expand Down
8 changes: 4 additions & 4 deletions Kernel/Devices/SB16.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -236,11 +236,11 @@ KResultOr<size_t> SB16::write(FileDescription&, size_t, const UserOrKernelBuffer
if (!m_dma_region) {
auto page = MM.allocate_supervisor_physical_page();
if (!page)
return KResult(-ENOMEM);
return ENOMEM;
auto vmobject = AnonymousVMObject::create_with_physical_page(*page);
m_dma_region = MM.allocate_kernel_region_with_vmobject(*vmobject, PAGE_SIZE, "SB16 DMA buffer", Region::Access::Write);
if (!m_dma_region)
return KResult(-ENOMEM);
return ENOMEM;
}

#ifdef SB16_DEBUG
Expand All @@ -249,15 +249,15 @@ KResultOr<size_t> SB16::write(FileDescription&, size_t, const UserOrKernelBuffer
ASSERT(length <= PAGE_SIZE);
const int BLOCK_SIZE = 32 * 1024;
if (length > BLOCK_SIZE) {
return KResult(-ENOSPC);
return ENOSPC;
}

u8 mode = (u8)SampleFormat::Signed | (u8)SampleFormat::Stereo;

const int sample_rate = 44100;
set_sample_rate(sample_rate);
if (!data.read(m_dma_region->vaddr().as_ptr(), length))
return KResult(-EFAULT);
return EFAULT;
dma_start(length);

// 16-bit single-cycle output.
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/SerialDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ KResultOr<size_t> SerialDevice::read(FileDescription&, size_t, UserOrKernelBuffe
return (ssize_t)data_size;
});
if (nwritten < 0)
return KResult(nwritten);
return KResult((ErrnoCode)-nwritten);

return size;
}
Expand All @@ -83,7 +83,7 @@ KResultOr<size_t> SerialDevice::write(FileDescription&, size_t, const UserOrKern
return (ssize_t)data_size;
});
if (nread < 0)
return KResult(nread);
return KResult((ErrnoCode)-nread);
return (size_t)nread;
}

Expand Down
2 changes: 1 addition & 1 deletion Kernel/Devices/ZeroDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ KResultOr<size_t> ZeroDevice::read(FileDescription&, size_t, UserOrKernelBuffer&
{
ssize_t count = min(static_cast<size_t>(PAGE_SIZE), size);
if (!buffer.memset(0, count))
return KResult(-EFAULT);
return EFAULT;
return count;
}

Expand Down
4 changes: 2 additions & 2 deletions Kernel/FileSystem/AnonymousFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,10 @@ AnonymousFile::~AnonymousFile()
KResultOr<Region*> AnonymousFile::mmap(Process& process, FileDescription&, VirtualAddress preferred_vaddr, size_t offset, size_t size, int prot, bool shared)
{
if (offset != 0)
return KResult(-EINVAL);
return EINVAL;

if (size != m_vmobject->size())
return KResult(-EINVAL);
return EINVAL;

return process.allocate_region_with_vmobject(preferred_vaddr, size, m_vmobject, offset, {}, prot, shared);
}
Expand Down
4 changes: 2 additions & 2 deletions Kernel/FileSystem/AnonymousFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ class AnonymousFile final : public File {
virtual String absolute_path(const FileDescription&) const override { return ":anonymous-file:"; }
virtual bool can_read(const FileDescription&, size_t) const override { return false; }
virtual bool can_write(const FileDescription&, size_t) const override { return false; }
virtual KResultOr<size_t> read(FileDescription&, size_t, UserOrKernelBuffer&, size_t) override { return KResult(-ENOTSUP); }
virtual KResultOr<size_t> write(FileDescription&, size_t, const UserOrKernelBuffer&, size_t) override { return KResult(-ENOTSUP); }
virtual KResultOr<size_t> read(FileDescription&, size_t, UserOrKernelBuffer&, size_t) override { return ENOTSUP; }
virtual KResultOr<size_t> write(FileDescription&, size_t, const UserOrKernelBuffer&, size_t) override { return ENOTSUP; }

explicit AnonymousFile(NonnullRefPtr<AnonymousVMObject>);

Expand Down
6 changes: 3 additions & 3 deletions Kernel/FileSystem/BlockBasedFileSystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ KResult BlockBasedFS::write_block(unsigned index, const UserOrKernelBuffer& data
return result;
}
if (!data.read(entry.data + offset, count))
return KResult(-EFAULT);
return EFAULT;

cache().mark_dirty(entry);
entry.has_data = true;
Expand Down Expand Up @@ -261,15 +261,15 @@ KResult BlockBasedFS::read_block(unsigned index, UserOrKernelBuffer* buffer, siz
entry.has_data = true;
}
if (buffer && !buffer->write(entry.data + offset, count))
return KResult(-EFAULT);
return EFAULT;
return KSuccess;
}

KResult BlockBasedFS::read_blocks(unsigned index, unsigned count, UserOrKernelBuffer& buffer, bool allow_cache) const
{
ASSERT(m_logical_block_size);
if (!count)
return KResult(-EINVAL);
return EINVAL;
if (count == 1)
return read_block(index, &buffer, block_size(), 0, allow_cache);
auto out = buffer;
Expand Down
22 changes: 11 additions & 11 deletions Kernel/FileSystem/DevFS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,17 +124,17 @@ ssize_t DevFSInode::write_bytes(off_t, ssize_t, const UserOrKernelBuffer&, FileD

KResultOr<NonnullRefPtr<Inode>> DevFSInode::create_child(const String&, mode_t, dev_t, uid_t, gid_t)
{
return KResult(-EROFS);
return EROFS;
}

KResult DevFSInode::add_child(Inode&, const StringView&, mode_t)
{
return KResult(-EROFS);
return EROFS;
}

KResult DevFSInode::remove_child(const StringView&)
{
return KResult(-EROFS);
return EROFS;
}

KResultOr<size_t> DevFSInode::directory_entry_count() const
Expand All @@ -144,17 +144,17 @@ KResultOr<size_t> DevFSInode::directory_entry_count() const

KResult DevFSInode::chmod(mode_t)
{
return KResult(-EPERM);
return EPERM;
}

KResult DevFSInode::chown(uid_t, gid_t)
{
return KResult(-EPERM);
return EPERM;
}

KResult DevFSInode::truncate(u64)
{
return KResult(-EPERM);
return EPERM;
}

String DevFSLinkInode::name() const
Expand Down Expand Up @@ -221,7 +221,7 @@ InodeMetadata DevFSDirectoryInode::metadata() const
KResult DevFSDirectoryInode::traverse_as_directory(Function<bool(const FS::DirectoryEntryView&)>) const
{
LOCKER(m_lock);
return KResult(-EINVAL);
return EINVAL;
}
RefPtr<Inode> DevFSDirectoryInode::lookup(StringView)
{
Expand Down Expand Up @@ -288,10 +288,10 @@ KResultOr<NonnullRefPtr<Inode>> DevFSRootDirectoryInode::create_child(const Stri
if (metadata.is_directory()) {
for (auto& folder : m_subfolders) {
if (folder.name() == name)
return KResult(-EEXIST);
return EEXIST;
}
if (name != "pts")
return KResult(-EROFS);
return EROFS;
auto new_directory_inode = adopt(*new DevFSPtsDirectoryInode(m_parent_fs));
m_subfolders.append(new_directory_inode);
m_parent_fs.m_nodes.append(new_directory_inode);
Expand All @@ -300,15 +300,15 @@ KResultOr<NonnullRefPtr<Inode>> DevFSRootDirectoryInode::create_child(const Stri
if (metadata.is_symlink()) {
for (auto& link : m_links) {
if (link.name() == name)
return KResult(-EEXIST);
return EEXIST;
}
dbgln("DevFS: Success on create new symlink");
auto new_link_inode = adopt(*new DevFSLinkInode(m_parent_fs, name));
m_links.append(new_link_inode);
m_parent_fs.m_nodes.append(new_link_inode);
return new_link_inode;
}
return KResult(-EROFS);
return EROFS;
}

DevFSRootDirectoryInode::~DevFSRootDirectoryInode()
Expand Down
12 changes: 6 additions & 6 deletions Kernel/FileSystem/DevPtsFS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ InodeMetadata DevPtsFSInode::metadata() const
KResult DevPtsFSInode::traverse_as_directory(Function<bool(const FS::DirectoryEntryView&)> callback) const
{
if (identifier().index() > 1)
return KResult(-ENOTDIR);
return ENOTDIR;

callback({ ".", identifier(), 0 });
callback({ "..", identifier(), 0 });
Expand Down Expand Up @@ -187,27 +187,27 @@ void DevPtsFSInode::flush_metadata()

KResult DevPtsFSInode::add_child(Inode&, const StringView&, mode_t)
{
return KResult(-EROFS);
return EROFS;
}

KResultOr<NonnullRefPtr<Inode>> DevPtsFSInode::create_child(const String&, mode_t, dev_t, uid_t, gid_t)
{
return KResult(-EROFS);
return EROFS;
}

KResult DevPtsFSInode::remove_child(const StringView&)
{
return KResult(-EROFS);
return EROFS;
}

KResult DevPtsFSInode::chmod(mode_t)
{
return KResult(-EPERM);
return EPERM;
}

KResult DevPtsFSInode::chown(uid_t, gid_t)
{
return KResult(-EPERM);
return EPERM;
}

}
Loading

0 comments on commit 19d3f8c

Please sign in to comment.