libc

my libc
git clone git://git.evenfri.pw/libc.git
Log | Files | Refs | README

commit 50746e60c0476b1835f5a8f7fc0a281225b5eb68
parent 9edcb271159648c4dc1ab9d9991a7a9cf0c59494
Author: evenfri <evenfri256@gmail.com>
Date:   Tue,  6 Oct 2026 20:17:21 +0800

fixes

Diffstat:
M_exit.c | 5+++--
Mchdir.c | 4++--
Mclose.c | 4++--
Mexecve.c | 4++--
Mfork.c | 4++--
Mfstat.c | 4++--
Mgetcwd.c | 6+++---
Mgetdents.c | 12+++++++-----
Mlibc.h | 29+----------------------------
Mlseek.c | 4++--
Mlstat.c | 4++--
Mmkdir.c | 6+++---
Mmkfile | 2+-
Mmmap.c | 10+++++-----
Mmount.c | 13++++++-------
Mmunmap.c | 8++++----
Mopen.c | 4++--
Mpoll.c | 6+++---
Mread.c | 4++--
Mrmdir.c | 6+++---
Mstart.s | 9++++-----
Mstat.c | 4++--
Msyscall.c | 21+++++++++++----------
Munlink.c | 6+++---
Mutime.c | 6++++--
Mwaitpid.c | 2+-
Mwrite.c | 4++--
27 files changed, 84 insertions(+), 107 deletions(-)

diff --git a/_exit.c b/_exit.c @@ -6,7 +6,8 @@ #include "libc.h" void _exit(int status) { - syscall(SYS_exit, (long)status, 0, 0, 0, 0, 0); + (void)syscall(SYS_exit, (long)status, 0, 0, 0, 0, 0); - for (;;) {} + for (;;) { + } } diff --git a/chdir.c b/chdir.c @@ -6,12 +6,12 @@ #include "libc.h" int chdir(const char *path) { - int ret = syscall(SYS_chdir, (long)path, 0, 0, 0, 0, 0); + long ret = syscall(SYS_chdir, (long)path, 0, 0, 0, 0, 0); if (ret < 0) { errno = -ret; return -1; } - return ret; + return (int)ret; } diff --git a/close.c b/close.c @@ -6,12 +6,12 @@ #include "libc.h" int close(int fd) { - int ret = syscall(SYS_close, (long)fd, 0, 0, 0, 0, 0); + long ret = syscall(SYS_close, (long)fd, 0, 0, 0, 0, 0); if (ret < 0) { errno = -ret; return -1; } - return ret; + return (int)ret; } diff --git a/execve.c b/execve.c @@ -6,12 +6,12 @@ #include "libc.h" int execve(const char *path, char *const argv[], char *const envp[]) { - int ret = syscall(SYS_execve, (long)path, (long)argv, (long)envp, 0, 0, 0); + long ret = syscall(SYS_execve, (long)path, (long)argv, (long)envp, 0, 0, 0); if (ret < 0) { errno = -ret; return -1; } - return ret; + return (int)ret; } diff --git a/fork.c b/fork.c @@ -6,12 +6,12 @@ #include "libc.h" int fork(void) { - int ret = syscall(SYS_clone, (long)SIGCHLD, 0, 0, 0, 0, 0); + long ret = syscall(SYS_fork, (long)SIGCHLD, 0, 0, 0, 0, 0); if (ret < 0) { errno = -ret; return -1; } - return ret; + return (int)ret; } diff --git a/fstat.c b/fstat.c @@ -6,12 +6,12 @@ #include "libc.h" int fstat(int fd, struct stat *statbuf) { - int ret = syscall(SYS_fstat, (long)fd, (long)statbuf, 0, 0, 0, 0); + long ret = syscall(SYS_fstat, (long)fd, (long)statbuf, 0, 0, 0, 0); if (ret < 0) { errno = -ret; return -1; } - return ret; + return (int)ret; } diff --git a/getcwd.c b/getcwd.c @@ -9,9 +9,9 @@ char *getcwd(char *buf, size_t size) { long ret = syscall(SYS_getcwd, (long)buf, (long)size, 0, 0, 0, 0); if (ret < 0) { - errno = -ret; - return NULL; - } + errno = -ret; + return NULL; + } return buf; } diff --git a/getdents.c b/getdents.c @@ -6,10 +6,12 @@ #include "libc.h" ssize_t getdents64(int fd, struct linux_dirent64 *dirp, size_t count) { - ssize_t ret = syscall(SYS_getdents64, (long)fd, (long)dirp, (long)count, 0, 0, 0); - if (ret < 0) { - errno = -ret; - return -1; + long ret = syscall(SYS_getdents64, (long)fd, (long)dirp, (long)count, 0, 0, 0); + + if (ret < 0) { + errno = -ret; + return -1; } - return ret; + + return (ssize_t)ret; } diff --git a/libc.h b/libc.h @@ -92,31 +92,7 @@ struct utimbuf { #define O_EXCL 0x80 #define O_DIRECTORY 0200000 -/* syscall numbers */ -#define SYS_read 0 -#define SYS_write 1 -#define SYS_open 2 -#define SYS_close 3 -#define SYS_stat 4 -#define SYS_fstat 5 -#define SYS_lstat 6 -#define SYS_poll 7 -#define SYS_lseek 8 -#define SYS_mmap 9 -#define SYS_munmap 11 -#define SYS_brk 12 -#define SYS_clone 56 -#define SYS_execve 59 -#define SYS_exit 60 -#define SYS_wait4 61 -#define SYS_getcwd 79 -#define SYS_chdir 80 -#define SYS_mkdir 83 -#define SYS_rmdir 84 -#define SYS_unlink 87 -#define SYS_utime 132 -#define SYS_mount 165 -#define SYS_getdents64 217 +#include "syscall.h" /* mmap flags */ #define PROT_READ 0x1 @@ -128,9 +104,6 @@ struct utimbuf { /* variables */ extern char **environ; -/* syscall function */ -long syscall(long num, long a1, long a2, long a3, long a4, long a5, long a6); - /* io */ ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); diff --git a/lseek.c b/lseek.c @@ -6,12 +6,12 @@ #include "libc.h" off_t lseek(int fd, off_t offset, int whence) { - off_t ret = syscall(SYS_lseek, (long)fd, (long)offset, (long)whence, 0, 0, 0); + long ret = syscall(SYS_lseek, (long)fd, (long)offset, (long)whence, 0, 0, 0); if (ret < 0) { errno = -ret; return -1; } - return ret; + return (off_t)ret; } diff --git a/lstat.c b/lstat.c @@ -6,12 +6,12 @@ #include "libc.h" int lstat(const char *pathname, struct stat *statbuf) { - int ret = syscall(SYS_lstat, (long)pathname, (long)statbuf, 0, 0, 0, 0); + long ret = syscall(SYS_lstat, (long)pathname, (long)statbuf, 0, 0, 0, 0); if (ret < 0) { errno = -ret; return -1; } - return ret; + return (int)ret; } diff --git a/mkdir.c b/mkdir.c @@ -6,12 +6,12 @@ #include "libc.h" int mkdir(const char *path, unsigned int mode) { - int ret = syscall(SYS_mkdir, (long)path, (long)mode, 0, 0, 0, 0); - + long ret = syscall(SYS_mkdir, (long)path, (long)mode, 0, 0, 0, 0); + if (ret < 0) { errno = -ret; return -1; } - return ret; + return (int)ret; } diff --git a/mkfile b/mkfile @@ -46,6 +46,6 @@ ofiles = start.$o \ memcpy.$o \ stack_chk.$o \ -hfiles = libc.h \ +hfiles = libc.h syscall.h \ <$PLAN9/src/mklib diff --git a/mmap.c b/mmap.c @@ -5,14 +5,14 @@ #include "libc.h" -void* mmap(void *addr, size_t length, int prot, int flags, int fd, long offset) { +void *mmap(void *addr, size_t length, int prot, int flags, int fd, long offset) { long ret = syscall(SYS_mmap, (long)addr, (long)length, (long)prot, (long)flags, (long)fd, (long)offset); if (ret < 0) { - errno = -ret; - return (void*)-1; - } + errno = -ret; + return (void *)-1; + } - return (void*)ret; + return (void *)ret; } diff --git a/mount.c b/mount.c @@ -5,10 +5,9 @@ #include "libc.h" -int mount(const char *src, const char *trg, const char *fstype, ulong_t flags, +int mount(const char *src, const char *trg, const char *fstype, ulong_t flags, const void *data) { - - int ret = syscall(SYS_mount, + long ret = syscall(SYS_mount, (long)src, (long)trg, (long)fstype, @@ -17,9 +16,9 @@ int mount(const char *src, const char *trg, const char *fstype, ulong_t flags, 0); if (ret < 0) { - errno = -ret; - return -1; - } + errno = -ret; + return -1; + } - return ret; + return (int)ret; } diff --git a/munmap.c b/munmap.c @@ -1,5 +1,5 @@ /* - * munmap.c - munmap system call wrapper + * munmap.c - munmap system call * Copyright (C) 2026. All rights reserved. */ @@ -9,9 +9,9 @@ int munmap(void *addr, size_t length) { long ret = syscall(SYS_munmap, (long)addr, (long)length, 0, 0, 0, 0); if (ret < 0) { - errno = -ret; - return -1; - } + errno = -ret; + return -1; + } return (int)ret; } diff --git a/open.c b/open.c @@ -6,12 +6,12 @@ #include "libc.h" int open(const char *filename, int flags, int mode) { - int ret = syscall(SYS_open, (long)filename, (long)flags, (long)mode, 0, 0, 0); + long ret = syscall(SYS_open, (long)filename, (long)flags, (long)mode, 0, 0, 0); if (ret < 0) { errno = -ret; return -1; } - return ret; + return (int)ret; } diff --git a/poll.c b/poll.c @@ -1,17 +1,17 @@ /* - * poll.c - pollsystem call + * poll.c - poll system call * Copyright (C) 2026. All rights reserved. */ #include "libc.h" int poll(struct pollfd *fds, nfds_t nfds, int timeout) { - int ret = syscall(SYS_poll, (long)fds, (long)nfds, (long)timeout, 0, 0, 0); + long ret = syscall(SYS_poll, (long)fds, (long)nfds, (long)timeout, 0, 0, 0); if (ret < 0) { errno = -ret; return -1; } - return ret; + return (int)ret; } diff --git a/read.c b/read.c @@ -6,12 +6,12 @@ #include "libc.h" ssize_t read(int fd, void *buf, size_t count) { - ssize_t ret = syscall(SYS_read, (long)fd, (long)buf, (long)count, 0, 0, 0); + long ret = syscall(SYS_read, (long)fd, (long)buf, (long)count, 0, 0, 0); if (ret < 0) { errno = -ret; return -1; } - return ret; + return (ssize_t)ret; } diff --git a/rmdir.c b/rmdir.c @@ -6,12 +6,12 @@ #include "libc.h" int rmdir(const char *path) { - int ret = syscall(SYS_rmdir, (long)path, 0, 0, 0, 0, 0); - + long ret = syscall(SYS_rmdir, (long)path, 0, 0, 0, 0, 0); + if (ret < 0) { errno = -ret; return -1; } - return ret; + return (int)ret; } diff --git a/start.s b/start.s @@ -1,6 +1,7 @@ .intel_syntax noprefix .global _start .extern environ +.extern _exit .text _start: @@ -8,19 +9,17 @@ _start: pop rdi mov rsi, rsp - lea rdx, [rsi + rdi*8 + 8] + lea rdx, [rsi + rdi*8 + 8] # save envp to environ lea rax, [rip + environ] mov [rax], rdx - sub rsp, 8 - + and rsp, -16 call main # exit(rax) mov rdi, rax - mov rax, 60 - syscall + call _exit jmp . diff --git a/stat.c b/stat.c @@ -6,12 +6,12 @@ #include "libc.h" int stat(const char *pathname, struct stat *statbuf) { - int ret = syscall(SYS_stat, (long)pathname, (long)statbuf, 0, 0, 0, 0); + long ret = syscall(SYS_stat, (long)pathname, (long)statbuf, 0, 0, 0, 0); if (ret < 0) { errno = -ret; return -1; } - return ret; + return (int)ret; } diff --git a/syscall.c b/syscall.c @@ -1,20 +1,21 @@ /* - * syscall.c - syscalls wrapper + * syscall.c - raw system call interface * Copyright (C) 2026. All rights reserved. */ -#include "libc.h" +#include "syscall.h" -static inline long call(long n, long a1, long a2, long a3, long a4, long a5, long a6) -{ +static inline long call(long num, long a1, long a2, long a3, long a4, long a5, + long a6) { long ret; + register long r10 asm("r10") = a4; + register long r8 asm("r8") = a5; + register long r9 asm("r9") = a6; - register long r10 __asm__("r10") = a4; - register long r8 __asm__("r8") = a5; - register long r9 __asm__("r9") = a6; - - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3), "r"(r10), "r"(r8), "r"(r9) : "rcx", "r11", "memory"); + asm volatile("syscall" + : "=a"(ret) + : "a"(num), "D"(a1), "S"(a2), "d"(a3), "r"(r10), "r"(r8), "r"(r9) + : "rcx", "r11", "cc", "memory"); return ret; } diff --git a/unlink.c b/unlink.c @@ -6,12 +6,12 @@ #include "libc.h" int unlink(const char *path) { - int ret = syscall(SYS_unlink, (long)path, 0, 0, 0, 0, 0); - + long ret = syscall(SYS_unlink, (long)path, 0, 0, 0, 0, 0); + if (ret < 0) { errno = -ret; return -1; } - return ret; + return (int)ret; } diff --git a/utime.c b/utime.c @@ -6,10 +6,12 @@ #include "libc.h" int utime(const char *path, const struct utimbuf *times) { - int ret = syscall(SYS_utime, (long)path, (long)times, 0, 0, 0, 0); + long ret = syscall(SYS_utime, (long)path, (long)times, 0, 0, 0, 0); + if (ret < 0) { errno = -ret; return -1; } - return ret; + + return (int)ret; } diff --git a/waitpid.c b/waitpid.c @@ -6,7 +6,7 @@ #include "libc.h" int waitpid(int pid, int *status, int options) { - int ret = syscall(SYS_wait4, (long)pid, (long)status, (long)options, 0, 0, 0); + long ret = syscall(SYS_wait4, (long)pid, (long)status, (long)options, 0, 0, 0); if (ret < 0) { errno = -ret; diff --git a/write.c b/write.c @@ -6,12 +6,12 @@ #include "libc.h" ssize_t write(int fd, const void *buf, size_t count) { - ssize_t ret = syscall(SYS_write, (long)fd, (long)buf, (long)count, 0, 0, 0); + long ret = syscall(SYS_write, (long)fd, (long)buf, (long)count, 0, 0, 0); if (ret < 0) { errno = -ret; return -1; } - return ret; + return (ssize_t)ret; }