commit 50746e60c0476b1835f5a8f7fc0a281225b5eb68
parent 9edcb271159648c4dc1ab9d9991a7a9cf0c59494
Author: evenfri <evenfri256@gmail.com>
Date: Tue, 6 Oct 2026 20:17:21 +0800
fixes
Diffstat:
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;
}