diff --git a/Kernel/include/driver.hpp b/Kernel/include/driver.hpp index 5bb87c8b..a7e3a0c6 100644 --- a/Kernel/include/driver.hpp +++ b/Kernel/include/driver.hpp @@ -86,6 +86,7 @@ extern const BuiltInDriver __kernel_builtin_drivers_end[]; namespace Driver { char GetScanCode(uint8_t ScanCode, bool Upper); + char GetControlCharacter(KeyScanCodes Key); bool IsValidChar(uint8_t ScanCode); struct DriverHandlers diff --git a/Kernel/subsystem/linux/include/defs.hpp b/Kernel/subsystem/linux/include/defs.hpp index 739faa91..e1b2f21e 100644 --- a/Kernel/subsystem/linux/include/defs.hpp +++ b/Kernel/subsystem/linux/include/defs.hpp @@ -447,4 +447,26 @@ struct sysinfo char _f[20 - 2 * sizeof(long) - sizeof(int)]; /* Padding to 64 bytes */ }; +struct linux_pollfd +{ + int fd; /* File Descriptor */ + short events; /* Requested Events */ + short revents; /* Returned Events */ +}; + +typedef unsigned long nfds_t; + +#define linux_POLLIN 0x001 +#define linux_POLLPRI 0x002 +#define linux_POLLOUT 0x004 +#define linux_POLLERR 0x008 +#define linux_POLLHUP 0x010 +#define linux_POLLNVAL 0x020 +#define linux_POLLRDNORM 0x040 +#define linux_POLLRDBAND 0x080 +#define linux_POLLWRNORM 0x100 +#define linux_POLLWRBAND 0x200 +#define linux_POLLMSG 0x400 +#define linux_POLLRDHUP 0x2000 + #endif // !__FENNIX_KERNEL_LINUX_DEFS_H__ diff --git a/Kernel/subsystem/linux/syscall.cpp b/Kernel/subsystem/linux/syscall.cpp index 280ac6d2..1ca1a384 100644 --- a/Kernel/subsystem/linux/syscall.cpp +++ b/Kernel/subsystem/linux/syscall.cpp @@ -899,6 +899,32 @@ static int linux_lstat(SysFrm *, const char *pathname, struct linux_kstat *statb return ret; } +static int linux_poll(SysFrm *, linux_pollfd *fds, nfds_t nfds, int timeout) +{ + PCB *pcb = thisProcess; + Memory::VirtualMemoryArea *vma = pcb->vma; + + auto pFds = vma->UserCheckAndGetAddress(fds, nfds * sizeof(linux_pollfd)); + if (pFds == nullptr) + return -linux_EFAULT; + + for (int i = 0; i < nfds; i++) + { + if (pFds[i].fd < 0) + return -linux_EBADF; + + debug("poll[%zu].fd=%d .events=%d .revents=%d", + i, pFds[i].fd, pFds[i].events, pFds[i].revents); + pFds[i].revents = 0; + } + + vfs::FileDescriptorTable *fdt = pcb->FileDescriptors; + UNUSED(fdt); + UNUSED(timeout); + fixme("poll is stub! returning 1"); + return 1; +} + // #include "../syscalls.h" static off_t linux_lseek(SysFrm *, int fd, off_t offset, int whence) @@ -3568,7 +3594,7 @@ static SyscallData LinuxSyscallsTableAMD64[] = { [__NR_amd64_stat] = {"stat", (void *)linux_stat}, [__NR_amd64_fstat] = {"fstat", (void *)linux_fstat}, [__NR_amd64_lstat] = {"lstat", (void *)linux_lstat}, - [__NR_amd64_poll] = {"poll", (void *)nullptr}, + [__NR_amd64_poll] = {"poll", (void *)linux_poll}, [__NR_amd64_lseek] = {"lseek", (void *)linux_lseek}, [__NR_amd64_mmap] = {"mmap", (void *)linux_mmap}, [__NR_amd64_mprotect] = {"mprotect", (void *)linux_mprotect}, @@ -4179,7 +4205,7 @@ static SyscallData LinuxSyscallsTableI386[] = { [__NR_i386_getresuid] = {"getresuid", (void *)nullptr}, [__NR_i386_vm86] = {"vm86", (void *)nullptr}, [__NR_i386_query_module] = {"query_module", (void *)nullptr}, - [__NR_i386_poll] = {"poll", (void *)nullptr}, + [__NR_i386_poll] = {"poll", (void *)linux_poll}, [__NR_i386_nfsservctl] = {"nfsservctl", (void *)nullptr}, [__NR_i386_setresgid] = {"setresgid", (void *)nullptr}, [__NR_i386_getresgid] = {"getresgid", (void *)nullptr},