From a40490d6a88a9214ebb3d5a990a9486e639776cd Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Fri, 16 Aug 2024 11:48:54 +0200 Subject: [PATCH] Cleaned and slightly refactored stdio.h and file I/O syscalls --- include/c/stddef.h | 9 +++++++++ include/c/stdint.h | 5 ++--- include/c/stdio.h | 26 -------------------------- include/c/stdlib.h | 8 ++------ include/c/syscall.h | 35 ++++++++++++++++++++++++++++++++--- include/interrupt/syscalls.h | 8 ++++---- kern.iso | Bin 1470464 -> 1470464 bytes 7 files changed, 49 insertions(+), 42 deletions(-) create mode 100644 include/c/stddef.h diff --git a/include/c/stddef.h b/include/c/stddef.h new file mode 100644 index 0000000..fbe6e30 --- /dev/null +++ b/include/c/stddef.h @@ -0,0 +1,9 @@ +#ifndef STDDEF_H +#define STDDEF_H + +#define NULL ((void*)0) + +typedef unsigned int size_t; +typedef signed int ssize_t; + +#endif diff --git a/include/c/stdint.h b/include/c/stdint.h index ae0b2a3..acc4ea0 100644 --- a/include/c/stdint.h +++ b/include/c/stdint.h @@ -1,7 +1,7 @@ #ifndef STDINT_H #define STDINT_H -#define NULL ((void*)0) +#include // Signed ints typedef signed char int8_t; @@ -15,7 +15,6 @@ typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned long long uint64_t; -// Other -typedef unsigned int size_t; +// TODO: floats #endif diff --git a/include/c/stdio.h b/include/c/stdio.h index 4c8c1ae..d219cd5 100644 --- a/include/c/stdio.h +++ b/include/c/stdio.h @@ -17,31 +17,6 @@ FILE* stdin; FILE* stdout; FILE* stderr; -/* --- Syscall Wrappers --- */ -int write(int fd, const void* ptr, size_t count) { - int result = 0; - __asm__ volatile ("int $0x80" : "=a"(result) : "a"(SYS_WRITE), "b"(fd), "c"(ptr), "d"(count)); - return result; -} - -int read(int fd, void* ptr, size_t count) { - int result = 0; - __asm__ volatile ("int $0x80" : "=a"(result) : "a"(SYS_GETS), "b"(fd), "c"(ptr), "d"(count)); - return result; -} - -int open(const char* path, int oflag) { - int fd = -1; - __asm__ volatile ("int $0x80" : "=a"(fd) : "a"(SYS_OPEN), "b"(path), "c"(oflag)); - return fd; -} - -int close(int fd) { - int result = -1; - __asm__ volatile ("int $0x80" : "=a"(result) : "a"(SYS_CLOSE), "b"(fd)); - return result; -} - /* --- file I/O --- */ FILE* fopen(const char* filename, const char* mode) { FILE* stream = malloc(sizeof(FILE)); @@ -90,7 +65,6 @@ size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream) { } return writtenEl; - } int fseek(FILE* stream, long int origin, int offset) { diff --git a/include/c/stdlib.h b/include/c/stdlib.h index 00ad0f1..e8bc904 100644 --- a/include/c/stdlib.h +++ b/include/c/stdlib.h @@ -5,15 +5,11 @@ #include void* malloc(const uint32_t size) { - void* ptr = 0; - __asm__ volatile ("int $0x80" : : "a"(SYS_MALLOC), "b"(size)); - __asm__ volatile ("movl %%eax, %0" : "=r"(ptr)); - - return ptr; + return (void*)syscall(SYS_MALLOC, size, 0, 0); } void free(const void* ptr) { - __asm__ volatile ("int $0x80" : : "a"(SYS_FREE), "b"(ptr)); + syscall(SYS_FREE, (int)ptr, 0, 0); } #endif diff --git a/include/c/syscall.h b/include/c/syscall.h index 93821e8..2070b58 100644 --- a/include/c/syscall.h +++ b/include/c/syscall.h @@ -1,12 +1,14 @@ -#ifndef SYSCALLNUMS_H -#define SYSCALLNUMS_H +#ifndef SYSCALL_H +#define SYSCALL_H + +#include #define MAX_SYSCALLS 9 typedef enum { SYS_RESERVED, SYS_SLEEP, - SYS_GETS, + SYS_READ, SYS_WRITE, SYS_OPEN, SYS_CLOSE, @@ -25,4 +27,31 @@ typedef enum { O_BIN = 0x40, // Read bytes, not text } OFLAGS; +int syscall(int nr, int arg0, int arg1, int arg2) { + int ret = 0; + __asm__ volatile ("int $0x80" : "=a"(ret) : "a"(nr), "b"(arg0), "c"(arg1), "d"(arg2)); + return ret; +} + +/* Syscall wrappers */ +int read(int fd, void* ptr, size_t count) { + // Returns: int fd + return syscall(SYS_READ, fd, (int)ptr, count); +} + +int write(int fd, const void* ptr, size_t count) { + // Returns: int count + return syscall(SYS_WRITE, fd, (int)ptr, count); +} + +int open(const char* path, int oflag) { + // Returns: int fd + return syscall(SYS_OPEN, (int)path, oflag, 0); +} + +int close(int fd) { + // Returns: int status + return syscall(SYS_CLOSE, fd, 0, 0); +} + #endif diff --git a/include/interrupt/syscalls.h b/include/interrupt/syscalls.h index a79ad34..5d2d6d7 100644 --- a/include/interrupt/syscalls.h +++ b/include/interrupt/syscalls.h @@ -1,5 +1,5 @@ -#ifndef SYSCALL_H -#define SYSCALL_H +#ifndef INTERRUPT_SYSCALLS_H +#define INTERRUPT_SYSCALLS_H #include #include @@ -47,7 +47,7 @@ void sys_write() { // TODO: Use a Read() sycall and read from stdin // Args: ebx - char* buffer -void sys_gets() { +void sys_read() { char* s; __asm__ volatile ("movl %%ebx, %0" : "=r"(s)); reads(s); @@ -102,7 +102,7 @@ void sys_seek() {} void (*syscalls[MAX_SYSCALLS])(void) = { [SYS_SLEEP] = sys_sleep, [SYS_WRITE] = sys_write, - [SYS_GETS] = sys_gets, + [SYS_READ] = sys_read, [SYS_MALLOC] = sys_malloc, [SYS_FREE] = sys_free, [SYS_OPEN] = sys_open, diff --git a/kern.iso b/kern.iso index 52350e60c942b085b932ac7c72a7b51dad8ddc6b..68bb134200f55313bb3b5fbc46259aef34048044 100644 GIT binary patch delta 5778 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 HB|P_U3;-V0 delta 5533 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