Skip to content

Commit

Permalink
Kernel: Fix the return type for syscalls
Browse files Browse the repository at this point in the history
The Process::Handler type has KResultOr<FlatPtr> as its return type.
Using a different return type with an equally-sized template parameter
sort of works but breaks once that condition is no longer true, e.g.
for KResultOr<int> on x86_64.

Ideally the syscall handlers would also take FlatPtrs as their args
so we can get rid of the reinterpret_cast for the function pointer
but I didn't quite feel like cleaning that up as well.
  • Loading branch information
gunnarbeutner authored and awesomekling committed Jun 28, 2021
1 parent b643537 commit 2a78bf8
Show file tree
Hide file tree
Showing 71 changed files with 313 additions and 301 deletions.
298 changes: 149 additions & 149 deletions Kernel/Process.h

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Kernel/Syscalls/access.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

namespace Kernel {

KResultOr<int> Process::sys$access(Userspace<const char*> user_path, size_t path_length, int mode)
KResultOr<FlatPtr> Process::sys$access(Userspace<const char*> user_path, size_t path_length, int mode)
{
REQUIRE_PROMISE(rpath);
auto path = get_syscall_path_argument(user_path, path_length);
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Syscalls/alarm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

namespace Kernel {

KResultOr<unsigned> Process::sys$alarm(unsigned seconds)
KResultOr<FlatPtr> Process::sys$alarm(unsigned seconds)
{
REQUIRE_PROMISE(stdio);
unsigned previous_alarm_remaining = 0;
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Syscalls/anon_create.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

namespace Kernel {

KResultOr<int> Process::sys$anon_create(size_t size, int options)
KResultOr<FlatPtr> Process::sys$anon_create(size_t size, int options)
{
REQUIRE_PROMISE(stdio);

Expand Down
2 changes: 1 addition & 1 deletion Kernel/Syscalls/beep.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

namespace Kernel {

KResultOr<int> Process::sys$beep()
KResultOr<FlatPtr> Process::sys$beep()
{
PCSpeaker::tone_on(440);
auto result = Thread::current()->sleep(Time::from_nanoseconds(200'000'000));
Expand Down
6 changes: 3 additions & 3 deletions Kernel/Syscalls/chdir.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

namespace Kernel {

KResultOr<int> Process::sys$chdir(Userspace<const char*> user_path, size_t path_length)
KResultOr<FlatPtr> Process::sys$chdir(Userspace<const char*> user_path, size_t path_length)
{
REQUIRE_PROMISE(rpath);
auto path = get_syscall_path_argument(user_path, path_length);
Expand All @@ -24,7 +24,7 @@ KResultOr<int> Process::sys$chdir(Userspace<const char*> user_path, size_t path_
return 0;
}

KResultOr<int> Process::sys$fchdir(int fd)
KResultOr<FlatPtr> Process::sys$fchdir(int fd)
{
REQUIRE_PROMISE(stdio);
auto description = file_description(fd);
Expand All @@ -41,7 +41,7 @@ KResultOr<int> Process::sys$fchdir(int fd)
return 0;
}

KResultOr<int> Process::sys$getcwd(Userspace<char*> buffer, size_t size)
KResultOr<FlatPtr> Process::sys$getcwd(Userspace<char*> buffer, size_t size)
{
REQUIRE_PROMISE(rpath);

Expand Down
4 changes: 2 additions & 2 deletions Kernel/Syscalls/chmod.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

namespace Kernel {

KResultOr<int> Process::sys$chmod(Userspace<const char*> user_path, size_t path_length, mode_t mode)
KResultOr<FlatPtr> Process::sys$chmod(Userspace<const char*> user_path, size_t path_length, mode_t mode)
{
REQUIRE_PROMISE(fattr);
auto path = get_syscall_path_argument(user_path, path_length);
Expand All @@ -20,7 +20,7 @@ KResultOr<int> Process::sys$chmod(Userspace<const char*> user_path, size_t path_
return VFS::the().chmod(path.value()->view(), mode, current_directory());
}

KResultOr<int> Process::sys$fchmod(int fd, mode_t mode)
KResultOr<FlatPtr> Process::sys$fchmod(int fd, mode_t mode)
{
REQUIRE_PROMISE(fattr);
auto description = file_description(fd);
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Syscalls/chown.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

namespace Kernel {

KResultOr<int> Process::sys$fchown(int fd, uid_t uid, gid_t gid)
KResultOr<FlatPtr> Process::sys$fchown(int fd, uid_t uid, gid_t gid)
{
REQUIRE_PROMISE(chown);
auto description = file_description(fd);
Expand All @@ -18,7 +18,7 @@ KResultOr<int> Process::sys$fchown(int fd, uid_t uid, gid_t gid)
return description->chown(uid, gid);
}

KResultOr<int> Process::sys$chown(Userspace<const Syscall::SC_chown_params*> user_params)
KResultOr<FlatPtr> Process::sys$chown(Userspace<const Syscall::SC_chown_params*> user_params)
{
REQUIRE_PROMISE(chown);
Syscall::SC_chown_params params;
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Syscalls/chroot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

namespace Kernel {

KResultOr<int> Process::sys$chroot(Userspace<const char*> user_path, size_t path_length, int mount_flags)
KResultOr<FlatPtr> Process::sys$chroot(Userspace<const char*> user_path, size_t path_length, int mount_flags)
{
if (!is_superuser())
return EPERM;
Expand Down
10 changes: 5 additions & 5 deletions Kernel/Syscalls/clock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

namespace Kernel {

KResultOr<int> Process::sys$clock_gettime(clockid_t clock_id, Userspace<timespec*> user_ts)
KResultOr<FlatPtr> Process::sys$clock_gettime(clockid_t clock_id, Userspace<timespec*> user_ts)
{
REQUIRE_PROMISE(stdio);

Expand All @@ -24,7 +24,7 @@ KResultOr<int> Process::sys$clock_gettime(clockid_t clock_id, Userspace<timespec
return 0;
}

KResultOr<int> Process::sys$clock_settime(clockid_t clock_id, Userspace<const timespec*> user_ts)
KResultOr<FlatPtr> Process::sys$clock_settime(clockid_t clock_id, Userspace<const timespec*> user_ts)
{
REQUIRE_PROMISE(settime);

Expand All @@ -45,7 +45,7 @@ KResultOr<int> Process::sys$clock_settime(clockid_t clock_id, Userspace<const ti
return 0;
}

KResultOr<int> Process::sys$clock_nanosleep(Userspace<const Syscall::SC_clock_nanosleep_params*> user_params)
KResultOr<FlatPtr> Process::sys$clock_nanosleep(Userspace<const Syscall::SC_clock_nanosleep_params*> user_params)
{
REQUIRE_PROMISE(stdio);

Expand Down Expand Up @@ -87,7 +87,7 @@ KResultOr<int> Process::sys$clock_nanosleep(Userspace<const Syscall::SC_clock_na
return 0;
}

KResultOr<int> Process::sys$adjtime(Userspace<const timeval*> user_delta, Userspace<timeval*> user_old_delta)
KResultOr<FlatPtr> Process::sys$adjtime(Userspace<const timeval*> user_delta, Userspace<timeval*> user_old_delta)
{
if (user_old_delta) {
timespec old_delta_ts = TimeManagement::the().remaining_epoch_time_adjustment();
Expand All @@ -112,7 +112,7 @@ KResultOr<int> Process::sys$adjtime(Userspace<const timeval*> user_delta, Usersp
return 0;
}

KResultOr<int> Process::sys$gettimeofday(Userspace<timeval*> user_tv)
KResultOr<FlatPtr> Process::sys$gettimeofday(Userspace<timeval*> user_tv)
{
REQUIRE_PROMISE(stdio);
auto tv = kgettimeofday().to_timeval();
Expand Down
6 changes: 3 additions & 3 deletions Kernel/Syscalls/debug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@

namespace Kernel {

KResultOr<int> Process::sys$dump_backtrace()
KResultOr<FlatPtr> Process::sys$dump_backtrace()
{
dump_backtrace();
return 0;
}

KResultOr<int> Process::sys$dbgputch(u8 ch)
KResultOr<FlatPtr> Process::sys$dbgputch(u8 ch)
{
dbgputch(ch);
return 0;
}

KResultOr<size_t> Process::sys$dbgputstr(Userspace<const u8*> characters, size_t size)
KResultOr<FlatPtr> Process::sys$dbgputstr(Userspace<const u8*> characters, size_t size)
{
if (size == 0)
return 0;
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Syscalls/disown.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

namespace Kernel {

KResultOr<int> Process::sys$disown(ProcessID pid)
KResultOr<FlatPtr> Process::sys$disown(ProcessID pid)
{
REQUIRE_PROMISE(proc);
auto process = Process::from_pid(pid);
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Syscalls/dup2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

namespace Kernel {

KResultOr<int> Process::sys$dup2(int old_fd, int new_fd)
KResultOr<FlatPtr> Process::sys$dup2(int old_fd, int new_fd)
{
REQUIRE_PROMISE(stdio);
auto description = file_description(old_fd);
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Syscalls/emuctl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

namespace Kernel {

KResultOr<int> Process::sys$emuctl()
KResultOr<FlatPtr> Process::sys$emuctl()
{
return ENOSYS;
}
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Syscalls/execve.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -919,7 +919,7 @@ KResult Process::exec(String path, Vector<String> arguments, Vector<String> envi
return KSuccess;
}

KResultOr<int> Process::sys$execve(Userspace<const Syscall::SC_execve_params*> user_params)
KResultOr<FlatPtr> Process::sys$execve(Userspace<const Syscall::SC_execve_params*> user_params)
{
REQUIRE_PROMISE(exec);

Expand Down
2 changes: 1 addition & 1 deletion Kernel/Syscalls/fcntl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

namespace Kernel {

KResultOr<int> Process::sys$fcntl(int fd, int cmd, u32 arg)
KResultOr<FlatPtr> Process::sys$fcntl(int fd, int cmd, u32 arg)
{
REQUIRE_PROMISE(stdio);
dbgln_if(IO_DEBUG, "sys$fcntl: fd={}, cmd={}, arg={}", fd, cmd, arg);
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Syscalls/fork.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

namespace Kernel {

KResultOr<pid_t> Process::sys$fork(RegisterState& regs)
KResultOr<FlatPtr> Process::sys$fork(RegisterState& regs)
{
REQUIRE_PROMISE(proc);
RefPtr<Thread> child_first_thread;
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Syscalls/ftruncate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

namespace Kernel {

KResultOr<int> Process::sys$ftruncate(int fd, Userspace<off_t*> userspace_length)
KResultOr<FlatPtr> Process::sys$ftruncate(int fd, Userspace<off_t*> userspace_length)
{
REQUIRE_PROMISE(stdio);
off_t length;
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Syscalls/futex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ void Process::clear_futex_queues_on_exec()
m_futex_queues.clear();
}

KResultOr<int> Process::sys$futex(Userspace<const Syscall::SC_futex_params*> user_params)
KResultOr<FlatPtr> Process::sys$futex(Userspace<const Syscall::SC_futex_params*> user_params)
{
Syscall::SC_futex_params params;
if (!copy_from_user(&params, user_params))
Expand Down
8 changes: 6 additions & 2 deletions Kernel/Syscalls/get_dir_entries.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

namespace Kernel {

KResultOr<size_t> Process::sys$get_dir_entries(int fd, Userspace<void*> user_buffer, size_t user_size)
KResultOr<FlatPtr> Process::sys$get_dir_entries(int fd, Userspace<void*> user_buffer, size_t user_size)
{
REQUIRE_PROMISE(stdio);
if (user_size > NumericLimits<ssize_t>::max())
Expand All @@ -20,7 +20,11 @@ KResultOr<size_t> Process::sys$get_dir_entries(int fd, Userspace<void*> user_buf
auto buffer = UserOrKernelBuffer::for_user_buffer(user_buffer, static_cast<size_t>(user_size));
if (!buffer.has_value())
return EFAULT;
return description->get_dir_entries(buffer.value(), user_size);
auto result = description->get_dir_entries(buffer.value(), user_size);
if (result.is_error())
return result.error();
else
return result.release_value();
}

}
2 changes: 1 addition & 1 deletion Kernel/Syscalls/get_stack_bounds.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

namespace Kernel {

KResultOr<int> Process::sys$get_stack_bounds(Userspace<FlatPtr*> user_stack_base, Userspace<size_t*> user_stack_size)
KResultOr<FlatPtr> Process::sys$get_stack_bounds(Userspace<FlatPtr*> user_stack_base, Userspace<size_t*> user_stack_size)
{
auto& regs = Thread::current()->get_register_dump_from_stack();
FlatPtr stack_pointer;
Expand Down
8 changes: 6 additions & 2 deletions Kernel/Syscalls/getrandom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ namespace Kernel {
// We don't use the flag yet, but we could use it for distinguishing
// random source like Linux, unlike the OpenBSD equivalent. However, if we
// do, we should be able of the caveats that Linux has dealt with.
KResultOr<size_t> Process::sys$getrandom(Userspace<void*> buffer, size_t buffer_size, [[maybe_unused]] unsigned flags)
KResultOr<FlatPtr> Process::sys$getrandom(Userspace<void*> buffer, size_t buffer_size, [[maybe_unused]] unsigned flags)
{
REQUIRE_PROMISE(stdio);
if (buffer_size > NumericLimits<ssize_t>::max())
Expand All @@ -22,10 +22,14 @@ KResultOr<size_t> Process::sys$getrandom(Userspace<void*> buffer, size_t buffer_
auto data_buffer = UserOrKernelBuffer::for_user_buffer(buffer, buffer_size);
if (!data_buffer.has_value())
return EFAULT;
return data_buffer.value().write_buffered<1024>(buffer_size, [&](u8* buffer, size_t buffer_bytes) {
auto result = data_buffer.value().write_buffered<1024>(buffer_size, [&](u8* buffer, size_t buffer_bytes) {
get_good_random_bytes(buffer, buffer_bytes);
return buffer_bytes;
});
if (result.is_error())
return result.error();
else
return result.release_value();
}

}
14 changes: 7 additions & 7 deletions Kernel/Syscalls/getuid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,47 +8,47 @@

namespace Kernel {

KResultOr<uid_t> Process::sys$getuid()
KResultOr<FlatPtr> Process::sys$getuid()
{
REQUIRE_PROMISE(stdio);
return uid();
}

KResultOr<gid_t> Process::sys$getgid()
KResultOr<FlatPtr> Process::sys$getgid()
{
REQUIRE_PROMISE(stdio);
return gid();
}

KResultOr<uid_t> Process::sys$geteuid()
KResultOr<FlatPtr> Process::sys$geteuid()
{
REQUIRE_PROMISE(stdio);
return euid();
}

KResultOr<gid_t> Process::sys$getegid()
KResultOr<FlatPtr> Process::sys$getegid()
{
REQUIRE_PROMISE(stdio);
return egid();
}

KResultOr<int> Process::sys$getresuid(Userspace<uid_t*> ruid, Userspace<uid_t*> euid, Userspace<uid_t*> suid)
KResultOr<FlatPtr> Process::sys$getresuid(Userspace<uid_t*> ruid, Userspace<uid_t*> euid, Userspace<uid_t*> suid)
{
REQUIRE_PROMISE(stdio);
if (!copy_to_user(ruid, &m_uid) || !copy_to_user(euid, &m_euid) || !copy_to_user(suid, &m_suid))
return EFAULT;
return 0;
}

KResultOr<int> Process::sys$getresgid(Userspace<gid_t*> rgid, Userspace<gid_t*> egid, Userspace<gid_t*> sgid)
KResultOr<FlatPtr> Process::sys$getresgid(Userspace<gid_t*> rgid, Userspace<gid_t*> egid, Userspace<gid_t*> sgid)
{
REQUIRE_PROMISE(stdio);
if (!copy_to_user(rgid, &m_gid) || !copy_to_user(egid, &m_egid) || !copy_to_user(sgid, &m_sgid))
return EFAULT;
return 0;
}

KResultOr<int> Process::sys$getgroups(size_t count, Userspace<gid_t*> user_gids)
KResultOr<FlatPtr> Process::sys$getgroups(size_t count, Userspace<gid_t*> user_gids)
{
REQUIRE_PROMISE(stdio);
if (!count)
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Syscalls/hostname.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Kernel {
extern String* g_hostname;
extern Lock* g_hostname_lock;

KResultOr<int> Process::sys$gethostname(Userspace<char*> buffer, size_t size)
KResultOr<FlatPtr> Process::sys$gethostname(Userspace<char*> buffer, size_t size)
{
REQUIRE_PROMISE(stdio);
if (size > NumericLimits<ssize_t>::max())
Expand All @@ -24,7 +24,7 @@ KResultOr<int> Process::sys$gethostname(Userspace<char*> buffer, size_t size)
return 0;
}

KResultOr<int> Process::sys$sethostname(Userspace<const char*> hostname, size_t length)
KResultOr<FlatPtr> Process::sys$sethostname(Userspace<const char*> hostname, size_t length)
{
REQUIRE_NO_PROMISES;
if (!is_superuser())
Expand Down
Loading

0 comments on commit 2a78bf8

Please sign in to comment.