From a288258785bac3c2000227532f4a17210813c506 Mon Sep 17 00:00:00 2001 From: Anton Kling Date: Thu, 16 Nov 2023 15:24:45 +0100 Subject: Kernel: Change how syscalls are built and implemented. --- kernel/Makefile | 2 +- kernel/cpu/syscall.c | 18 +------ kernel/includes/syscalls.h | 109 ++++++++++++++++++++++++++++++++++++++++ kernel/includes/time.h | 10 ++++ kernel/scalls/accept.c | 5 -- kernel/scalls/accept.h | 9 ---- kernel/scalls/bind.c | 5 -- kernel/scalls/bind.h | 9 ---- kernel/scalls/chdir.c | 6 --- kernel/scalls/chdir.h | 1 - kernel/scalls/clock_gettime.c | 10 ---- kernel/scalls/clock_gettime.h | 8 --- kernel/scalls/ftruncate.c | 6 --- kernel/scalls/ftruncate.h | 2 - kernel/scalls/getcwd.c | 11 ---- kernel/scalls/getcwd.h | 3 -- kernel/scalls/kill.c | 5 -- kernel/scalls/kill.h | 2 - kernel/scalls/mkdir.c | 5 -- kernel/scalls/mkdir.h | 2 - kernel/scalls/mmap.c | 7 --- kernel/scalls/mmap.h | 13 ----- kernel/scalls/msleep.c | 9 ---- kernel/scalls/msleep.h | 5 -- kernel/scalls/ppoll.c | 11 ---- kernel/scalls/ppoll.h | 9 ---- kernel/scalls/recvfrom.c | 59 ---------------------- kernel/scalls/recvfrom.h | 11 ---- kernel/scalls/sendto.c | 23 --------- kernel/scalls/sendto.h | 11 ---- kernel/scalls/shm.c | 6 --- kernel/scalls/shm.h | 14 ------ kernel/scalls/sigaction.c | 9 ---- kernel/scalls/sigaction.h | 3 -- kernel/scalls/socket.c | 5 -- kernel/scalls/socket.h | 9 ---- kernel/scalls/stat.c | 12 ----- kernel/scalls/stat.h | 9 ---- kernel/scalls/uptime.c | 4 -- kernel/scalls/uptime.h | 2 - kernel/syscalls/accept.c | 5 ++ kernel/syscalls/bind.c | 5 ++ kernel/syscalls/chdir.c | 6 +++ kernel/syscalls/clock_gettime.c | 10 ++++ kernel/syscalls/ftruncate.c | 6 +++ kernel/syscalls/getcwd.c | 11 ++++ kernel/syscalls/kill.c | 5 ++ kernel/syscalls/mkdir.c | 5 ++ kernel/syscalls/mmap.c | 7 +++ kernel/syscalls/msleep.c | 9 ++++ kernel/syscalls/ppoll.c | 11 ++++ kernel/syscalls/recvfrom.c | 59 ++++++++++++++++++++++ kernel/syscalls/sendto.c | 23 +++++++++ kernel/syscalls/shm.c | 6 +++ kernel/syscalls/sigaction.c | 9 ++++ kernel/syscalls/socket.c | 5 ++ kernel/syscalls/stat.c | 12 +++++ kernel/syscalls/uptime.c | 4 ++ kernel/time.h | 10 ---- 59 files changed, 319 insertions(+), 348 deletions(-) create mode 100644 kernel/includes/syscalls.h create mode 100644 kernel/includes/time.h delete mode 100644 kernel/scalls/accept.c delete mode 100644 kernel/scalls/accept.h delete mode 100644 kernel/scalls/bind.c delete mode 100644 kernel/scalls/bind.h delete mode 100644 kernel/scalls/chdir.c delete mode 100644 kernel/scalls/chdir.h delete mode 100644 kernel/scalls/clock_gettime.c delete mode 100644 kernel/scalls/clock_gettime.h delete mode 100644 kernel/scalls/ftruncate.c delete mode 100644 kernel/scalls/ftruncate.h delete mode 100644 kernel/scalls/getcwd.c delete mode 100644 kernel/scalls/getcwd.h delete mode 100644 kernel/scalls/kill.c delete mode 100644 kernel/scalls/kill.h delete mode 100644 kernel/scalls/mkdir.c delete mode 100644 kernel/scalls/mkdir.h delete mode 100644 kernel/scalls/mmap.c delete mode 100644 kernel/scalls/mmap.h delete mode 100644 kernel/scalls/msleep.c delete mode 100644 kernel/scalls/msleep.h delete mode 100644 kernel/scalls/ppoll.c delete mode 100644 kernel/scalls/ppoll.h delete mode 100644 kernel/scalls/recvfrom.c delete mode 100644 kernel/scalls/recvfrom.h delete mode 100644 kernel/scalls/sendto.c delete mode 100644 kernel/scalls/sendto.h delete mode 100644 kernel/scalls/shm.c delete mode 100644 kernel/scalls/shm.h delete mode 100644 kernel/scalls/sigaction.c delete mode 100644 kernel/scalls/sigaction.h delete mode 100644 kernel/scalls/socket.c delete mode 100644 kernel/scalls/socket.h delete mode 100644 kernel/scalls/stat.c delete mode 100644 kernel/scalls/stat.h delete mode 100644 kernel/scalls/uptime.c delete mode 100644 kernel/scalls/uptime.h create mode 100644 kernel/syscalls/accept.c create mode 100644 kernel/syscalls/bind.c create mode 100644 kernel/syscalls/chdir.c create mode 100644 kernel/syscalls/clock_gettime.c create mode 100644 kernel/syscalls/ftruncate.c create mode 100644 kernel/syscalls/getcwd.c create mode 100644 kernel/syscalls/kill.c create mode 100644 kernel/syscalls/mkdir.c create mode 100644 kernel/syscalls/mmap.c create mode 100644 kernel/syscalls/msleep.c create mode 100644 kernel/syscalls/ppoll.c create mode 100644 kernel/syscalls/recvfrom.c create mode 100644 kernel/syscalls/sendto.c create mode 100644 kernel/syscalls/shm.c create mode 100644 kernel/syscalls/sigaction.c create mode 100644 kernel/syscalls/socket.c create mode 100644 kernel/syscalls/stat.c create mode 100644 kernel/syscalls/uptime.c delete mode 100644 kernel/time.h (limited to 'kernel') diff --git a/kernel/Makefile b/kernel/Makefile index b5df27e..2497d0a 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -1,6 +1,6 @@ CC="i686-sb-gcc" AS="i686-sb-as" -OBJ = arch/i386/boot.o init/kernel.o cpu/gdt.o cpu/reload_gdt.o cpu/idt.o cpu/io.o libc/stdio/print.o drivers/keyboard.o log.o drivers/pit.o libc/string/memcpy.o libc/string/strlen.o libc/string/memcmp.o drivers/ata.o libc/string/memset.o cpu/syscall.o read_eip.o libc/exit/assert.o process.o cpu/int_syscall.o libc/string/strcpy.o arch/i386/mmu.o kmalloc.o fs/ext2.o fs/vfs.o fs/devfs.o cpu/spinlock.o random.o libc/string/strcmp.o crypto/ChaCha20/chacha20.o crypto/SHA1/sha1.o fs/tmpfs.o libc/string/isequal.o drivers/pst.o halts.o scalls/ppoll.o scalls/ftruncate.o kubsan.o scalls/mmap.o drivers/serial.o scalls/accept.o scalls/bind.o scalls/socket.o socket.o poll.o fs/fifo.o hashmap/hashmap.o fs/shm.o scalls/shm.o elf.o ksbrk.o sched/scheduler.o scalls/stat.o libc/string/copy.o libc/string/strncpy.o drivers/mouse.o libc/string/strlcpy.o libc/string/strcat.o drivers/vbe.o scalls/msleep.o scalls/uptime.o scalls/mkdir.o drivers/pci.o drivers/rtl8139.o network/ethernet.o network/arp.o network/bytes.o network/ipv4.o network/udp.o scalls/recvfrom.o math.o scalls/sendto.o signal.o scalls/kill.o scalls/sigaction.o network/tcp.o drivers/ahci.o crypto/xoshiro256plusplus/xoshiro256plusplus.o scalls/chdir.o scalls/getcwd.o +OBJ = arch/i386/boot.o init/kernel.o cpu/gdt.o cpu/reload_gdt.o cpu/idt.o cpu/io.o libc/stdio/print.o drivers/keyboard.o log.o drivers/pit.o libc/string/memcpy.o libc/string/strlen.o libc/string/memcmp.o drivers/ata.o libc/string/memset.o cpu/syscall.o read_eip.o libc/exit/assert.o process.o cpu/int_syscall.o libc/string/strcpy.o arch/i386/mmu.o kmalloc.o fs/ext2.o fs/vfs.o fs/devfs.o cpu/spinlock.o random.o libc/string/strcmp.o crypto/ChaCha20/chacha20.o crypto/SHA1/sha1.o fs/tmpfs.o libc/string/isequal.o drivers/pst.o halts.o syscalls/ppoll.o syscalls/ftruncate.o kubsan.o syscalls/mmap.o drivers/serial.o syscalls/accept.o syscalls/bind.o syscalls/socket.o socket.o poll.o fs/fifo.o hashmap/hashmap.o fs/shm.o syscalls/shm.o elf.o ksbrk.o sched/scheduler.o syscalls/stat.o libc/string/copy.o libc/string/strncpy.o drivers/mouse.o libc/string/strlcpy.o libc/string/strcat.o drivers/vbe.o syscalls/msleep.o syscalls/uptime.o syscalls/mkdir.o drivers/pci.o drivers/rtl8139.o network/ethernet.o network/arp.o network/bytes.o network/ipv4.o network/udp.o syscalls/recvfrom.o math.o syscalls/sendto.o signal.o syscalls/kill.o syscalls/sigaction.o network/tcp.o drivers/ahci.o crypto/xoshiro256plusplus/xoshiro256plusplus.o syscalls/chdir.o syscalls/getcwd.o CFLAGS = -O0 -fsanitize=vla-bound,shift-exponent,pointer-overflow,shift,signed-integer-overflow,bounds -ggdb -ffreestanding -Wall -Werror -mgeneral-regs-only -Wimplicit-fallthrough -I./libc/include/ -I. -Wno-pointer-sign INCLUDE=-I./includes/ -I./libc/include/ diff --git a/kernel/cpu/syscall.c b/kernel/cpu/syscall.c index 40a5b07..a1e39ac 100644 --- a/kernel/cpu/syscall.c +++ b/kernel/cpu/syscall.c @@ -7,23 +7,7 @@ #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #include #include diff --git a/kernel/includes/syscalls.h b/kernel/includes/syscalls.h new file mode 100644 index 0000000..7ee0105 --- /dev/null +++ b/kernel/includes/syscalls.h @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct SYS_ACCEPT_PARAMS { + int socket; + struct sockaddr *address; + socklen_t *address_len; +} __attribute__((packed)) SYS_ACCEPT_PARAMS; + +int syscall_accept(SYS_ACCEPT_PARAMS *args); + +typedef struct SYS_BIND_PARAMS { + int sockfd; + const struct sockaddr *addr; + socklen_t addrlen; +} __attribute__((packed)) SYS_BIND_PARAMS; + +int syscall_bind(SYS_BIND_PARAMS *args); +int syscall_chdir(const char *path); + +typedef struct SYS_CLOCK_GETTIME_PARAMS { + clockid_t clk; + struct timespec *ts; +} __attribute__((packed)) SYS_CLOCK_GETTIME_PARAMS; + +int syscall_clock_gettime(SYS_CLOCK_GETTIME_PARAMS *args); +int syscall_ftruncate(int fd, size_t length); + +char *syscall_getcwd(char *buf, size_t size); +int syscall_kill(pid_t pid, int sig); +int syscall_mkdir(const char *path, int mode); + +typedef struct SYS_MMAP_PARAMS { + void *addr; + size_t length; + int prot; + int flags; + int fd; + size_t offset; +} __attribute__((packed)) SYS_MMAP_PARAMS; + +void *syscall_mmap(SYS_MMAP_PARAMS *args); +#ifndef MSLEEP_H +#define MSLEEP_H +void syscall_msleep(u32 ms); +#endif + +typedef struct SYS_POLL_PARAMS { + struct pollfd *fds; + size_t nfds; + int timeout; +} __attribute__((packed)) SYS_POLL_PARAMS; + +int syscall_poll(SYS_POLL_PARAMS *args); + +struct two_args { + u32 a; + u32 b; +}; + +size_t syscall_recvfrom( + int socket, void *buffer, size_t length, int flags, + struct two_args + *extra_args /*struct sockaddr *address, socklen_t *address_len*/); + +struct t_two_args { + u32 a; + u32 b; +}; +size_t syscall_sendto(int socket, const void *message, size_t length, + int flags, struct t_two_args *extra_args /* + const struct sockaddr *dest_addr, + socklen_t dest_len*/); +#ifndef SYS_SHM_H +#define SYS_SHM_H + +typedef struct SYS_SHM_OPEN_PARAMS { + const char *name; + int oflag; + mode_t mode; +} __attribute__((packed)) SYS_SHM_OPEN_PARAMS; + +int syscall_shm_open(SYS_SHM_OPEN_PARAMS *args); +#endif +int syscall_sigaction(int sig, const struct sigaction *restrict act, + struct sigaction *restrict oact); + +typedef struct SYS_SOCKET_PARAMS { + int domain; + int type; + int protocol; +} __attribute__((packed)) SYS_SOCKET_PARAMS; + +int syscall_socket(SYS_SOCKET_PARAMS *args); + +typedef struct SYS_STAT_PARAMS { + const char *pathname; + struct stat *statbuf; +} __attribute__((packed)) SYS_STAT_PARAMS; + +int syscall_stat(SYS_STAT_PARAMS *args); +u32 syscall_uptime(void); diff --git a/kernel/includes/time.h b/kernel/includes/time.h new file mode 100644 index 0000000..aa9a4ce --- /dev/null +++ b/kernel/includes/time.h @@ -0,0 +1,10 @@ +typedef int clockid_t; +#ifndef TIME_H +#define TIME_H +#include + +struct timespec { + time_t tv_sec; // Seconds. + long tv_nsec; // Nanoseconds. +}; +#endif diff --git a/kernel/scalls/accept.c b/kernel/scalls/accept.c deleted file mode 100644 index 3c3f5ad..0000000 --- a/kernel/scalls/accept.c +++ /dev/null @@ -1,5 +0,0 @@ -#include "accept.h" - -int syscall_accept(SYS_ACCEPT_PARAMS *args) { - return accept(args->socket, args->address, args->address_len); -} diff --git a/kernel/scalls/accept.h b/kernel/scalls/accept.h deleted file mode 100644 index d022999..0000000 --- a/kernel/scalls/accept.h +++ /dev/null @@ -1,9 +0,0 @@ -#include "../socket.h" - -typedef struct SYS_ACCEPT_PARAMS { - int socket; - struct sockaddr *address; - socklen_t *address_len; -} __attribute__((packed)) SYS_ACCEPT_PARAMS; - -int syscall_accept(SYS_ACCEPT_PARAMS *args); diff --git a/kernel/scalls/bind.c b/kernel/scalls/bind.c deleted file mode 100644 index 76e36ab..0000000 --- a/kernel/scalls/bind.c +++ /dev/null @@ -1,5 +0,0 @@ -#include "bind.h" - -int syscall_bind(SYS_BIND_PARAMS *args) { - return bind(args->sockfd, args->addr, args->addrlen); -} diff --git a/kernel/scalls/bind.h b/kernel/scalls/bind.h deleted file mode 100644 index 5661ad0..0000000 --- a/kernel/scalls/bind.h +++ /dev/null @@ -1,9 +0,0 @@ -#include "../socket.h" - -typedef struct SYS_BIND_PARAMS { - int sockfd; - const struct sockaddr *addr; - socklen_t addrlen; -} __attribute__((packed)) SYS_BIND_PARAMS; - -int syscall_bind(SYS_BIND_PARAMS *args); diff --git a/kernel/scalls/chdir.c b/kernel/scalls/chdir.c deleted file mode 100644 index ec6ba92..0000000 --- a/kernel/scalls/chdir.c +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -int syscall_chdir(const char *path) { - return vfs_chdir(path); -} diff --git a/kernel/scalls/chdir.h b/kernel/scalls/chdir.h deleted file mode 100644 index 574ca0d..0000000 --- a/kernel/scalls/chdir.h +++ /dev/null @@ -1 +0,0 @@ -int syscall_chdir(const char *path); diff --git a/kernel/scalls/clock_gettime.c b/kernel/scalls/clock_gettime.c deleted file mode 100644 index 632ea08..0000000 --- a/kernel/scalls/clock_gettime.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -int syscall_clock_gettime(SYS_CLOCK_GETTIME_PARAMS *args) { - // FIXME: Actually implement this - if (args->ts) { - args->ts->tv_sec = 0; - args->ts->tv_nsec = 0; - } - return 0; -} diff --git a/kernel/scalls/clock_gettime.h b/kernel/scalls/clock_gettime.h deleted file mode 100644 index 145aa24..0000000 --- a/kernel/scalls/clock_gettime.h +++ /dev/null @@ -1,8 +0,0 @@ -#include - -typedef struct SYS_CLOCK_GETTIME_PARAMS { - clockid_t clk; - struct timespec *ts; -} __attribute__((packed)) SYS_CLOCK_GETTIME_PARAMS; - -int syscall_clock_gettime(SYS_CLOCK_GETTIME_PARAMS *args); diff --git a/kernel/scalls/ftruncate.c b/kernel/scalls/ftruncate.c deleted file mode 100644 index 6bc1170..0000000 --- a/kernel/scalls/ftruncate.c +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -int syscall_ftruncate(int fd, size_t length) { - return vfs_ftruncate(fd, length); -} diff --git a/kernel/scalls/ftruncate.h b/kernel/scalls/ftruncate.h deleted file mode 100644 index 9213e85..0000000 --- a/kernel/scalls/ftruncate.h +++ /dev/null @@ -1,2 +0,0 @@ -#include -int syscall_ftruncate(int fd, size_t length); diff --git a/kernel/scalls/getcwd.c b/kernel/scalls/getcwd.c deleted file mode 100644 index 629d0f5..0000000 --- a/kernel/scalls/getcwd.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include -#include - -char *syscall_getcwd(char *buf, size_t size) { - kprintf("syscall_getcwd\n"); - const char *cwd = get_current_task()->current_working_directory; - size_t len = min(size, strlen(cwd)); - strlcpy(buf, get_current_task()->current_working_directory, len); - return buf; -} diff --git a/kernel/scalls/getcwd.h b/kernel/scalls/getcwd.h deleted file mode 100644 index 671d7bd..0000000 --- a/kernel/scalls/getcwd.h +++ /dev/null @@ -1,3 +0,0 @@ -#include - -char *syscall_getcwd(char *buf, size_t size); diff --git a/kernel/scalls/kill.c b/kernel/scalls/kill.c deleted file mode 100644 index d5b7445..0000000 --- a/kernel/scalls/kill.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include -#include - -int syscall_kill(pid_t pid, int sig) {return kill(pid, sig);} diff --git a/kernel/scalls/kill.h b/kernel/scalls/kill.h deleted file mode 100644 index acf5f30..0000000 --- a/kernel/scalls/kill.h +++ /dev/null @@ -1,2 +0,0 @@ -#include -int syscall_kill(pid_t pid, int sig); diff --git a/kernel/scalls/mkdir.c b/kernel/scalls/mkdir.c deleted file mode 100644 index 43f2424..0000000 --- a/kernel/scalls/mkdir.c +++ /dev/null @@ -1,5 +0,0 @@ -#include - -int syscall_mkdir(const char *path, int mode) { - return vfs_mkdir(path, mode); -} diff --git a/kernel/scalls/mkdir.h b/kernel/scalls/mkdir.h deleted file mode 100644 index 0bf0043..0000000 --- a/kernel/scalls/mkdir.h +++ /dev/null @@ -1,2 +0,0 @@ -#include -int syscall_mkdir(const char *path, int mode); diff --git a/kernel/scalls/mmap.c b/kernel/scalls/mmap.c deleted file mode 100644 index 83fff6a..0000000 --- a/kernel/scalls/mmap.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -void *syscall_mmap(SYS_MMAP_PARAMS *args) { - return mmap(args->addr, args->length, args->prot, args->flags, args->fd, - args->offset); -} diff --git a/kernel/scalls/mmap.h b/kernel/scalls/mmap.h deleted file mode 100644 index 6b27005..0000000 --- a/kernel/scalls/mmap.h +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -typedef struct SYS_MMAP_PARAMS { - void *addr; - size_t length; - int prot; - int flags; - int fd; - size_t offset; -} __attribute__((packed)) SYS_MMAP_PARAMS; - -void *syscall_mmap(SYS_MMAP_PARAMS *args); diff --git a/kernel/scalls/msleep.c b/kernel/scalls/msleep.c deleted file mode 100644 index 77c4272..0000000 --- a/kernel/scalls/msleep.c +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include -#include -#include - -void syscall_msleep(u32 ms) { - get_current_task()->sleep_until = pit_num_ms() + ms; - switch_task(); -} diff --git a/kernel/scalls/msleep.h b/kernel/scalls/msleep.h deleted file mode 100644 index 03be904..0000000 --- a/kernel/scalls/msleep.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef MSLEEP_H -#define MSLEEP_H -#include -void syscall_msleep(u32 ms); -#endif diff --git a/kernel/scalls/ppoll.c b/kernel/scalls/ppoll.c deleted file mode 100644 index 8feb35c..0000000 --- a/kernel/scalls/ppoll.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include -#include -#include - -int syscall_poll(SYS_POLL_PARAMS *args) { - struct pollfd *fds = args->fds; - size_t nfds = args->nfds; - int timeout = args->timeout; - return poll(fds, nfds, timeout); -} diff --git a/kernel/scalls/ppoll.h b/kernel/scalls/ppoll.h deleted file mode 100644 index 13700b5..0000000 --- a/kernel/scalls/ppoll.h +++ /dev/null @@ -1,9 +0,0 @@ -#include - -typedef struct SYS_POLL_PARAMS { - struct pollfd *fds; - size_t nfds; - int timeout; -} __attribute__((packed)) SYS_POLL_PARAMS; - -int syscall_poll(SYS_POLL_PARAMS *args); diff --git a/kernel/scalls/recvfrom.c b/kernel/scalls/recvfrom.c deleted file mode 100644 index af4e809..0000000 --- a/kernel/scalls/recvfrom.c +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include -#include -#include -#include - -size_t syscall_recvfrom( - int socket, void *buffer, size_t length, int flags, - struct two_args - *extra_args /*struct sockaddr *address, socklen_t *address_len*/) { - - struct sockaddr *address = (struct sockaddr *)extra_args->a; - socklen_t *address_len = (socklen_t *)extra_args->b; - kprintf("address: %x\n", address); - kprintf("address_len: %x\n", address_len); - - if (flags & MSG_WAITALL) { - struct pollfd fds[1]; - fds[0].fd = socket; - fds[0].events = POLLIN; - poll(fds, 1, 0); - } - - u16 data_length; - socklen_t tmp_socklen; - vfs_pread(socket, &tmp_socklen, sizeof(socklen_t), 0); - if (address_len) - *address_len = tmp_socklen; - if (address) { - vfs_pread(socket, address, tmp_socklen, 0); - } else { - // We still have to throwaway the data. - char devnull[100]; - for (; tmp_socklen;) { - int rc = vfs_pread(socket, devnull, min(tmp_socklen, 100), 0); - assert(rc >= 0); - tmp_socklen -= rc; - } - } - - vfs_pread(socket, &data_length, sizeof(data_length), 0); - // If it is reading less than the packet length that could cause - // problems as the next read will not be put at a new header. Luckily - // it seems as if other UNIX systems can discard the rest of the - // packet if not read. - - // Read in the data requested - int read_len = min(length, data_length); - int rc = vfs_pread(socket, buffer, read_len, 0); - // Discard the rest of the packet - int rest = data_length - read_len; - char devnull[100]; - for (; rest;) { - int rc = vfs_pread(socket, devnull, 100, 0); - assert(rc >= 0); - rest -= rc; - } - return rc; -} diff --git a/kernel/scalls/recvfrom.h b/kernel/scalls/recvfrom.h deleted file mode 100644 index 72e4712..0000000 --- a/kernel/scalls/recvfrom.h +++ /dev/null @@ -1,11 +0,0 @@ -#include - -struct two_args { - u32 a; - u32 b; -}; - -size_t syscall_recvfrom( - int socket, void *buffer, size_t length, int flags, - struct two_args - *extra_args /*struct sockaddr *address, socklen_t *address_len*/); diff --git a/kernel/scalls/sendto.c b/kernel/scalls/sendto.c deleted file mode 100644 index 48c4020..0000000 --- a/kernel/scalls/sendto.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include -#include -#include - -size_t syscall_sendto(int socket, const void *message, size_t length, - int flags, struct t_two_args *extra_args /* - const struct sockaddr *dest_addr, - socklen_t dest_len*/) { - const struct sockaddr *dest_addr = (const struct sockaddr *)extra_args->a; - socklen_t dest_len = (socklen_t)extra_args->b; - (void)dest_len; - vfs_fd_t *fd = get_vfs_fd(socket); - assert(fd); - SOCKET *s = (SOCKET *)fd->inode->internal_object; - OPEN_INET_SOCKET *inet = s->child; - assert(inet); - struct sockaddr_in in; - in.sin_addr.s_addr = inet->address; - in.sin_port = inet->port; - send_udp_packet(&in, (const struct sockaddr_in *)dest_addr, message, length); - return length; // FIXME: This is probably not true. -} diff --git a/kernel/scalls/sendto.h b/kernel/scalls/sendto.h deleted file mode 100644 index 40c32ee..0000000 --- a/kernel/scalls/sendto.h +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -struct t_two_args { - u32 a; - u32 b; -}; -size_t syscall_sendto(int socket, const void *message, size_t length, - int flags, struct t_two_args *extra_args /* - const struct sockaddr *dest_addr, - socklen_t dest_len*/); diff --git a/kernel/scalls/shm.c b/kernel/scalls/shm.c deleted file mode 100644 index 979084a..0000000 --- a/kernel/scalls/shm.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "shm.h" -#include "../fs/shm.h" - -int syscall_shm_open(SYS_SHM_OPEN_PARAMS *args) { - return shm_open(args->name, args->oflag, args->mode); -} diff --git a/kernel/scalls/shm.h b/kernel/scalls/shm.h deleted file mode 100644 index a247cfd..0000000 --- a/kernel/scalls/shm.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef SYS_SHM_H -#define SYS_SHM_H -#include -#include -#include - -typedef struct SYS_SHM_OPEN_PARAMS { - const char *name; - int oflag; - mode_t mode; -} __attribute__((packed)) SYS_SHM_OPEN_PARAMS; - -int syscall_shm_open(SYS_SHM_OPEN_PARAMS *args); -#endif diff --git a/kernel/scalls/sigaction.c b/kernel/scalls/sigaction.c deleted file mode 100644 index 0166fab..0000000 --- a/kernel/scalls/sigaction.c +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include -#include - -int syscall_sigaction(int sig, const struct sigaction *restrict act, - struct sigaction *restrict oact) { - set_signal_handler(sig, act->sa_handler); - return 0; -} diff --git a/kernel/scalls/sigaction.h b/kernel/scalls/sigaction.h deleted file mode 100644 index 0f0aa5f..0000000 --- a/kernel/scalls/sigaction.h +++ /dev/null @@ -1,3 +0,0 @@ -#include -int syscall_sigaction(int sig, const struct sigaction *restrict act, - struct sigaction *restrict oact) ; diff --git a/kernel/scalls/socket.c b/kernel/scalls/socket.c deleted file mode 100644 index 594c745..0000000 --- a/kernel/scalls/socket.c +++ /dev/null @@ -1,5 +0,0 @@ -#include "socket.h" - -int syscall_socket(SYS_SOCKET_PARAMS *args) { - return socket(args->domain, args->type, args->protocol); -} diff --git a/kernel/scalls/socket.h b/kernel/scalls/socket.h deleted file mode 100644 index 6540b0f..0000000 --- a/kernel/scalls/socket.h +++ /dev/null @@ -1,9 +0,0 @@ -#include "../socket.h" - -typedef struct SYS_SOCKET_PARAMS { - int domain; - int type; - int protocol; -} __attribute__((packed)) SYS_SOCKET_PARAMS; - -int syscall_socket(SYS_SOCKET_PARAMS *args); diff --git a/kernel/scalls/stat.c b/kernel/scalls/stat.c deleted file mode 100644 index 9fc115b..0000000 --- a/kernel/scalls/stat.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include -#include - -int syscall_stat(SYS_STAT_PARAMS *args) { - const char *pathname = copy_and_allocate_user_string(args->pathname); - struct stat *statbuf = args->statbuf; - int fd = vfs_open(pathname, O_READ, 0); - int rc = vfs_fstat(fd, statbuf); - vfs_close(fd); - return rc; -} diff --git a/kernel/scalls/stat.h b/kernel/scalls/stat.h deleted file mode 100644 index 24c5d7c..0000000 --- a/kernel/scalls/stat.h +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include - -typedef struct SYS_STAT_PARAMS { - const char *pathname; - struct stat *statbuf; -} __attribute__((packed)) SYS_STAT_PARAMS; - -int syscall_stat(SYS_STAT_PARAMS *args); diff --git a/kernel/scalls/uptime.c b/kernel/scalls/uptime.c deleted file mode 100644 index 748915e..0000000 --- a/kernel/scalls/uptime.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include - -u32 syscall_uptime(void) { return (u32)pit_num_ms(); } diff --git a/kernel/scalls/uptime.h b/kernel/scalls/uptime.h deleted file mode 100644 index b432454..0000000 --- a/kernel/scalls/uptime.h +++ /dev/null @@ -1,2 +0,0 @@ -#include -u32 syscall_uptime(void); diff --git a/kernel/syscalls/accept.c b/kernel/syscalls/accept.c new file mode 100644 index 0000000..0be578c --- /dev/null +++ b/kernel/syscalls/accept.c @@ -0,0 +1,5 @@ +#include + +int syscall_accept(SYS_ACCEPT_PARAMS *args) { + return accept(args->socket, args->address, args->address_len); +} diff --git a/kernel/syscalls/bind.c b/kernel/syscalls/bind.c new file mode 100644 index 0000000..53eeb79 --- /dev/null +++ b/kernel/syscalls/bind.c @@ -0,0 +1,5 @@ +#include + +int syscall_bind(SYS_BIND_PARAMS *args) { + return bind(args->sockfd, args->addr, args->addrlen); +} diff --git a/kernel/syscalls/chdir.c b/kernel/syscalls/chdir.c new file mode 100644 index 0000000..4b1f714 --- /dev/null +++ b/kernel/syscalls/chdir.c @@ -0,0 +1,6 @@ +#include +#include + +int syscall_chdir(const char *path) { + return vfs_chdir(path); +} diff --git a/kernel/syscalls/clock_gettime.c b/kernel/syscalls/clock_gettime.c new file mode 100644 index 0000000..c0696d7 --- /dev/null +++ b/kernel/syscalls/clock_gettime.c @@ -0,0 +1,10 @@ +#include + +int syscall_clock_gettime(SYS_CLOCK_GETTIME_PARAMS *args) { + // FIXME: Actually implement this + if (args->ts) { + args->ts->tv_sec = 0; + args->ts->tv_nsec = 0; + } + return 0; +} diff --git a/kernel/syscalls/ftruncate.c b/kernel/syscalls/ftruncate.c new file mode 100644 index 0000000..2ed5ccc --- /dev/null +++ b/kernel/syscalls/ftruncate.c @@ -0,0 +1,6 @@ +#include +#include + +int syscall_ftruncate(int fd, size_t length) { + return vfs_ftruncate(fd, length); +} diff --git a/kernel/syscalls/getcwd.c b/kernel/syscalls/getcwd.c new file mode 100644 index 0000000..6f35739 --- /dev/null +++ b/kernel/syscalls/getcwd.c @@ -0,0 +1,11 @@ +#include +#include +#include + +char *syscall_getcwd(char *buf, size_t size) { + kprintf("syscall_getcwd\n"); + const char *cwd = get_current_task()->current_working_directory; + size_t len = min(size, strlen(cwd)); + strlcpy(buf, get_current_task()->current_working_directory, len); + return buf; +} diff --git a/kernel/syscalls/kill.c b/kernel/syscalls/kill.c new file mode 100644 index 0000000..6f8c865 --- /dev/null +++ b/kernel/syscalls/kill.c @@ -0,0 +1,5 @@ +#include +#include +#include + +int syscall_kill(pid_t pid, int sig) {return kill(pid, sig);} diff --git a/kernel/syscalls/mkdir.c b/kernel/syscalls/mkdir.c new file mode 100644 index 0000000..e7dec0b --- /dev/null +++ b/kernel/syscalls/mkdir.c @@ -0,0 +1,5 @@ +#include + +int syscall_mkdir(const char *path, int mode) { + return vfs_mkdir(path, mode); +} diff --git a/kernel/syscalls/mmap.c b/kernel/syscalls/mmap.c new file mode 100644 index 0000000..295bc13 --- /dev/null +++ b/kernel/syscalls/mmap.c @@ -0,0 +1,7 @@ +#include +#include + +void *syscall_mmap(SYS_MMAP_PARAMS *args) { + return mmap(args->addr, args->length, args->prot, args->flags, args->fd, + args->offset); +} diff --git a/kernel/syscalls/msleep.c b/kernel/syscalls/msleep.c new file mode 100644 index 0000000..9880b63 --- /dev/null +++ b/kernel/syscalls/msleep.c @@ -0,0 +1,9 @@ +#include +#include +#include +#include + +void syscall_msleep(u32 ms) { + get_current_task()->sleep_until = pit_num_ms() + ms; + switch_task(); +} diff --git a/kernel/syscalls/ppoll.c b/kernel/syscalls/ppoll.c new file mode 100644 index 0000000..fa85e8c --- /dev/null +++ b/kernel/syscalls/ppoll.c @@ -0,0 +1,11 @@ +#include +#include +#include +#include + +int syscall_poll(SYS_POLL_PARAMS *args) { + struct pollfd *fds = args->fds; + size_t nfds = args->nfds; + int timeout = args->timeout; + return poll(fds, nfds, timeout); +} diff --git a/kernel/syscalls/recvfrom.c b/kernel/syscalls/recvfrom.c new file mode 100644 index 0000000..ecc9fdf --- /dev/null +++ b/kernel/syscalls/recvfrom.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include +#include + +size_t syscall_recvfrom( + int socket, void *buffer, size_t length, int flags, + struct two_args + *extra_args /*struct sockaddr *address, socklen_t *address_len*/) { + + struct sockaddr *address = (struct sockaddr *)extra_args->a; + socklen_t *address_len = (socklen_t *)extra_args->b; + kprintf("address: %x\n", address); + kprintf("address_len: %x\n", address_len); + + if (flags & MSG_WAITALL) { + struct pollfd fds[1]; + fds[0].fd = socket; + fds[0].events = POLLIN; + poll(fds, 1, 0); + } + + u16 data_length; + socklen_t tmp_socklen; + vfs_pread(socket, &tmp_socklen, sizeof(socklen_t), 0); + if (address_len) + *address_len = tmp_socklen; + if (address) { + vfs_pread(socket, address, tmp_socklen, 0); + } else { + // We still have to throwaway the data. + char devnull[100]; + for (; tmp_socklen;) { + int rc = vfs_pread(socket, devnull, min(tmp_socklen, 100), 0); + assert(rc >= 0); + tmp_socklen -= rc; + } + } + + vfs_pread(socket, &data_length, sizeof(data_length), 0); + // If it is reading less than the packet length that could cause + // problems as the next read will not be put at a new header. Luckily + // it seems as if other UNIX systems can discard the rest of the + // packet if not read. + + // Read in the data requested + int read_len = min(length, data_length); + int rc = vfs_pread(socket, buffer, read_len, 0); + // Discard the rest of the packet + int rest = data_length - read_len; + char devnull[100]; + for (; rest;) { + int rc = vfs_pread(socket, devnull, 100, 0); + assert(rc >= 0); + rest -= rc; + } + return rc; +} diff --git a/kernel/syscalls/sendto.c b/kernel/syscalls/sendto.c new file mode 100644 index 0000000..ffedd75 --- /dev/null +++ b/kernel/syscalls/sendto.c @@ -0,0 +1,23 @@ +#include +#include +#include +#include + +size_t syscall_sendto(int socket, const void *message, size_t length, + int flags, struct t_two_args *extra_args /* + const struct sockaddr *dest_addr, + socklen_t dest_len*/) { + const struct sockaddr *dest_addr = (const struct sockaddr *)extra_args->a; + socklen_t dest_len = (socklen_t)extra_args->b; + (void)dest_len; + vfs_fd_t *fd = get_vfs_fd(socket); + assert(fd); + SOCKET *s = (SOCKET *)fd->inode->internal_object; + OPEN_INET_SOCKET *inet = s->child; + assert(inet); + struct sockaddr_in in; + in.sin_addr.s_addr = inet->address; + in.sin_port = inet->port; + send_udp_packet(&in, (const struct sockaddr_in *)dest_addr, message, length); + return length; // FIXME: This is probably not true. +} diff --git a/kernel/syscalls/shm.c b/kernel/syscalls/shm.c new file mode 100644 index 0000000..18b672a --- /dev/null +++ b/kernel/syscalls/shm.c @@ -0,0 +1,6 @@ +#include +#include + +int syscall_shm_open(SYS_SHM_OPEN_PARAMS *args) { + return shm_open(args->name, args->oflag, args->mode); +} diff --git a/kernel/syscalls/sigaction.c b/kernel/syscalls/sigaction.c new file mode 100644 index 0000000..98024ea --- /dev/null +++ b/kernel/syscalls/sigaction.c @@ -0,0 +1,9 @@ +#include +#include +#include + +int syscall_sigaction(int sig, const struct sigaction *restrict act, + struct sigaction *restrict oact) { + set_signal_handler(sig, act->sa_handler); + return 0; +} diff --git a/kernel/syscalls/socket.c b/kernel/syscalls/socket.c new file mode 100644 index 0000000..b5c8000 --- /dev/null +++ b/kernel/syscalls/socket.c @@ -0,0 +1,5 @@ +#include + +int syscall_socket(SYS_SOCKET_PARAMS *args) { + return socket(args->domain, args->type, args->protocol); +} diff --git a/kernel/syscalls/stat.c b/kernel/syscalls/stat.c new file mode 100644 index 0000000..103ac34 --- /dev/null +++ b/kernel/syscalls/stat.c @@ -0,0 +1,12 @@ +#include +#include +#include + +int syscall_stat(SYS_STAT_PARAMS *args) { + const char *pathname = copy_and_allocate_user_string(args->pathname); + struct stat *statbuf = args->statbuf; + int fd = vfs_open(pathname, O_READ, 0); + int rc = vfs_fstat(fd, statbuf); + vfs_close(fd); + return rc; +} diff --git a/kernel/syscalls/uptime.c b/kernel/syscalls/uptime.c new file mode 100644 index 0000000..3de80ba --- /dev/null +++ b/kernel/syscalls/uptime.c @@ -0,0 +1,4 @@ +#include +#include + +u32 syscall_uptime(void) { return (u32)pit_num_ms(); } diff --git a/kernel/time.h b/kernel/time.h deleted file mode 100644 index 2d4eef6..0000000 --- a/kernel/time.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef TIME_H -#define TIME_H -#include - -typedef int clockid_t; -struct timespec { - time_t tv_sec; // Seconds. - long tv_nsec; // Nanoseconds. -}; -#endif -- cgit v1.2.3