summaryrefslogtreecommitdiff
path: root/lume-legacy/src/ulib/syscalls.c
blob: 676bf1809d8e125d6b1d87ecf9a0e59bbebaafb8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Copyright (C) 2026 Richard Qin
 * Libc Syscall Shims
 */

#include "common/types.h"
#include "user/user.h"

// Define external raw syscalls from usys.S
extern int sys_openat(int dfd, const char *filename, int flags, int mode);
extern int sys_mknodat(int dfd, const char *filename, int mode, int dev);
extern int sys_mkdirat(int dfd, const char *path, int mode);
extern int sys_unlinkat(int dfd, const char *path, int flags);
extern int sys_linkat(int olddfd, const char *oldpath, int newdfd, const char *newpath, int flags);
extern int sys_chdir(const char *path);
extern int sys_dup(int oldfd);
extern int sys_fstat(int fd, void *statbuf);
extern int sys_read(int fd, void *buf, int count);
extern int sys_write(int fd, const void *buf, int count);
extern int sys_close(int fd);
extern int sys_pipe2(int pipefd[2], int flags);
extern int sys_clone(unsigned long flags, void *stack, int *ptid, void *tls, int *ctid);
extern int sys_execve(const char *path, char *const argv[], char *const envp[]);
extern int sys_wait4(int pid, int *status, int options, void *rusage);
extern int sys_exit(int status);
extern int sys_getpid();
extern int sys_brk(int n);
extern int sys_kill(int pid, int sig);
extern int sys_nanosleep(void *req, void *rem);
extern int sys_reboot(int magic1, int magic2, int cmd, void *arg);
extern int sys_lseek(int fd, int offset, int whence);
extern void sys_putc(char c);
extern int sys_disk_test();

// --- POSIX Implementation ---

int open(const char *path, int flags)
{
    return sys_openat(AT_FDCWD, path, flags, 0);
}

int mknod(const char *path, short major, short minor)
{
    // Pack major/minor into simplified dev_t (major << 20 | minor)
    int dev = (major << 20) | (minor & 0xFFFFF);
    return sys_mknodat(AT_FDCWD, path, 0, dev);
}

int mkdir(const char *path)
{
    return sys_mkdirat(AT_FDCWD, path, 0);
}

int unlink(const char *path)
{
    return sys_unlinkat(AT_FDCWD, path, 0);
}

int link(const char *oldpath, const char *newpath)
{
    return sys_linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0);
}

int chdir(const char *path)
{
    return sys_chdir(path);
}

int fork()
{
    return sys_clone(0, 0, 0, 0, 0);
}

int exec(char *path, char **argv)
{
    return sys_execve(path, argv, 0);
}

int wait(uint64 status_addr)
{
    return sys_wait4(-1, (int *)status_addr, 0, 0);
}

int pipe(int p[])
{
    return sys_pipe2(p, 0);
}

int read(int fd, void *buf, int n)
{
    return sys_read(fd, buf, n);
}

int write(int fd, const void *buf, int n)
{
    return sys_write(fd, buf, n);
}

int close(int fd)
{
    return sys_close(fd);
}

int fstat(int fd, void *st)
{
    return sys_fstat(fd, st);
}

int dup(int fd)
{
    return sys_dup(fd);
}

int getpid()
{
    return sys_getpid();
}

char *sbrk(int n)
{
    return (char *)(long)sys_brk(n);
}

int kill(int pid)
{
    return sys_kill(pid, 0);
}

int sleep(int ticks)
{
    return sys_nanosleep((void *)(long)ticks, 0);
}

int shutdown()
{
    return sys_reboot(0, 0, 0, 0);
}

void putc(char c)
{
    sys_putc(c);
}

int disk_test()
{
    return sys_disk_test();
}

int lseek(int fd, int offset, int whence)
{
    return sys_lseek(fd, offset, whence);
}