mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 13:28:11 +00:00

It's now possible to create symbolic links! :^) This exposed an issue in Ext2FS where we'd write uninitialized data past the end of an inode's content. Fix this by zeroing out the tail end of the last block in a file.
169 lines
4.6 KiB
C++
169 lines
4.6 KiB
C++
#pragma once
|
|
|
|
#include <AK/Types.h>
|
|
#include <LibC/fd_set.h>
|
|
|
|
#define ENUMERATE_SYSCALLS \
|
|
__ENUMERATE_SYSCALL(sleep) \
|
|
__ENUMERATE_SYSCALL(yield) \
|
|
__ENUMERATE_SYSCALL(putch) \
|
|
__ENUMERATE_SYSCALL(open) \
|
|
__ENUMERATE_SYSCALL(close) \
|
|
__ENUMERATE_SYSCALL(read) \
|
|
__ENUMERATE_SYSCALL(lseek) \
|
|
__ENUMERATE_SYSCALL(kill) \
|
|
__ENUMERATE_SYSCALL(getuid) \
|
|
__ENUMERATE_SYSCALL(exit) \
|
|
__ENUMERATE_SYSCALL(getgid) \
|
|
__ENUMERATE_SYSCALL(getpid) \
|
|
__ENUMERATE_SYSCALL(waitpid) \
|
|
__ENUMERATE_SYSCALL(mmap) \
|
|
__ENUMERATE_SYSCALL(munmap) \
|
|
__ENUMERATE_SYSCALL(get_dir_entries) \
|
|
__ENUMERATE_SYSCALL(lstat) \
|
|
__ENUMERATE_SYSCALL(getcwd) \
|
|
__ENUMERATE_SYSCALL(gettimeofday) \
|
|
__ENUMERATE_SYSCALL(gethostname) \
|
|
__ENUMERATE_SYSCALL(chdir) \
|
|
__ENUMERATE_SYSCALL(uname) \
|
|
__ENUMERATE_SYSCALL(set_mmap_name) \
|
|
__ENUMERATE_SYSCALL(readlink) \
|
|
__ENUMERATE_SYSCALL(write) \
|
|
__ENUMERATE_SYSCALL(ttyname_r) \
|
|
__ENUMERATE_SYSCALL(stat) \
|
|
__ENUMERATE_SYSCALL(getsid) \
|
|
__ENUMERATE_SYSCALL(setsid) \
|
|
__ENUMERATE_SYSCALL(getpgid) \
|
|
__ENUMERATE_SYSCALL(setpgid) \
|
|
__ENUMERATE_SYSCALL(getpgrp) \
|
|
__ENUMERATE_SYSCALL(fork) \
|
|
__ENUMERATE_SYSCALL(execve) \
|
|
__ENUMERATE_SYSCALL(geteuid) \
|
|
__ENUMERATE_SYSCALL(getegid) \
|
|
__ENUMERATE_SYSCALL(isatty) \
|
|
__ENUMERATE_SYSCALL(getdtablesize) \
|
|
__ENUMERATE_SYSCALL(dup) \
|
|
__ENUMERATE_SYSCALL(dup2) \
|
|
__ENUMERATE_SYSCALL(sigaction) \
|
|
__ENUMERATE_SYSCALL(getppid) \
|
|
__ENUMERATE_SYSCALL(umask) \
|
|
__ENUMERATE_SYSCALL(getgroups) \
|
|
__ENUMERATE_SYSCALL(setgroups) \
|
|
__ENUMERATE_SYSCALL(sigreturn) \
|
|
__ENUMERATE_SYSCALL(sigprocmask) \
|
|
__ENUMERATE_SYSCALL(sigpending) \
|
|
__ENUMERATE_SYSCALL(pipe) \
|
|
__ENUMERATE_SYSCALL(killpg) \
|
|
__ENUMERATE_SYSCALL(setuid) \
|
|
__ENUMERATE_SYSCALL(setgid) \
|
|
__ENUMERATE_SYSCALL(alarm) \
|
|
__ENUMERATE_SYSCALL(fstat) \
|
|
__ENUMERATE_SYSCALL(access) \
|
|
__ENUMERATE_SYSCALL(fcntl) \
|
|
__ENUMERATE_SYSCALL(ioctl) \
|
|
__ENUMERATE_SYSCALL(mkdir) \
|
|
__ENUMERATE_SYSCALL(times) \
|
|
__ENUMERATE_SYSCALL(utime) \
|
|
__ENUMERATE_SYSCALL(sync) \
|
|
__ENUMERATE_SYSCALL(ptsname_r) \
|
|
__ENUMERATE_SYSCALL(select) \
|
|
__ENUMERATE_SYSCALL(unlink) \
|
|
__ENUMERATE_SYSCALL(poll) \
|
|
__ENUMERATE_SYSCALL(read_tsc) \
|
|
__ENUMERATE_SYSCALL(rmdir) \
|
|
__ENUMERATE_SYSCALL(chmod) \
|
|
__ENUMERATE_SYSCALL(usleep) \
|
|
__ENUMERATE_SYSCALL(socket) \
|
|
__ENUMERATE_SYSCALL(bind) \
|
|
__ENUMERATE_SYSCALL(accept) \
|
|
__ENUMERATE_SYSCALL(listen) \
|
|
__ENUMERATE_SYSCALL(connect) \
|
|
__ENUMERATE_SYSCALL(create_shared_buffer) \
|
|
__ENUMERATE_SYSCALL(get_shared_buffer) \
|
|
__ENUMERATE_SYSCALL(release_shared_buffer) \
|
|
__ENUMERATE_SYSCALL(link) \
|
|
__ENUMERATE_SYSCALL(chown) \
|
|
__ENUMERATE_SYSCALL(fchmod) \
|
|
__ENUMERATE_SYSCALL(symlink) \
|
|
|
|
|
|
namespace Syscall {
|
|
|
|
enum Function {
|
|
#undef __ENUMERATE_SYSCALL
|
|
#define __ENUMERATE_SYSCALL(x) SC_ ##x ,
|
|
ENUMERATE_SYSCALLS
|
|
#undef __ENUMERATE_SYSCALL
|
|
};
|
|
|
|
inline constexpr const char* to_string(Function function)
|
|
{
|
|
switch (function) {
|
|
#undef __ENUMERATE_SYSCALL
|
|
#define __ENUMERATE_SYSCALL(x) case SC_ ##x: return #x;
|
|
ENUMERATE_SYSCALLS
|
|
#undef __ENUMERATE_SYSCALL
|
|
}
|
|
return "Unknown";
|
|
}
|
|
|
|
#ifdef SERENITY
|
|
struct SC_mmap_params {
|
|
uint32_t addr;
|
|
uint32_t size;
|
|
int32_t prot;
|
|
int32_t flags;
|
|
int32_t fd;
|
|
int32_t offset; // FIXME: 64-bit off_t?
|
|
};
|
|
|
|
struct SC_select_params {
|
|
int nfds;
|
|
fd_set* readfds;
|
|
fd_set* writefds;
|
|
fd_set* exceptfds;
|
|
struct timeval* timeout;
|
|
};
|
|
|
|
void initialize();
|
|
int sync();
|
|
|
|
inline dword invoke(Function function)
|
|
{
|
|
dword result;
|
|
asm volatile("int $0x82":"=a"(result):"a"(function):"memory");
|
|
return result;
|
|
}
|
|
|
|
template<typename T1>
|
|
inline dword invoke(Function function, T1 arg1)
|
|
{
|
|
dword result;
|
|
asm volatile("int $0x82":"=a"(result):"a"(function),"d"((dword)arg1):"memory");
|
|
return result;
|
|
}
|
|
|
|
template<typename T1, typename T2>
|
|
inline dword invoke(Function function, T1 arg1, T2 arg2)
|
|
{
|
|
dword result;
|
|
asm volatile("int $0x82":"=a"(result):"a"(function),"d"((dword)arg1),"c"((dword)arg2):"memory");
|
|
return result;
|
|
}
|
|
|
|
template<typename T1, typename T2, typename T3>
|
|
inline dword invoke(Function function, T1 arg1, T2 arg2, T3 arg3)
|
|
{
|
|
dword result;
|
|
asm volatile("int $0x82":"=a"(result):"a"(function),"d"((dword)arg1),"c"((dword)arg2),"b"((dword)arg3):"memory");
|
|
return result;
|
|
}
|
|
#endif
|
|
|
|
}
|
|
|
|
#undef __ENUMERATE_SYSCALL
|
|
#define __ENUMERATE_SYSCALL(x) using Syscall::SC_ ##x;
|
|
ENUMERATE_SYSCALLS
|
|
#undef __ENUMERATE_SYSCALL
|
|
#define syscall Syscall::invoke
|