Squash commits for public release
This commit is contained in:
73
kernel/include/syscalls/handlers.h
Normal file
73
kernel/include/syscalls/handlers.h
Normal file
@@ -0,0 +1,73 @@
|
||||
#ifndef _KERNEL_SYSCALLS_HANDLERS_H
|
||||
#define _KERNEL_SYSCALLS_HANDLERS_H
|
||||
|
||||
#include <libkern/syscall_structs.h>
|
||||
#include <libkern/types.h>
|
||||
#include <platform/generic/tasking/trapframe.h>
|
||||
|
||||
#define ksys0(sysid) ksyscall_impl(sysid, 0, 0, 0, 0);
|
||||
#define ksys1(sysid, a) ksyscall_impl(sysid, (intptr_t)a, 0, 0, 0);
|
||||
#define ksys2(sysid, a, b) ksyscall_impl(sysid, (intptr_t)a, (intptr_t)b, 0, 0);
|
||||
#define ksys3(sysid, a, b, c) ksyscall_impl(sysid, (intptr_t)a, (intptr_t)b, (intptr_t)c, 0);
|
||||
#define ksys4(sysid, a, b, c, d) ksyscall_impl(sysid, (intptr_t)a, (intptr_t)b, (intptr_t)c, (intptr_t)d);
|
||||
int ksyscall_impl(intptr_t sysid, intptr_t a, intptr_t b, intptr_t c, intptr_t d);
|
||||
|
||||
void sys_handler(trapframe_t* tf);
|
||||
void sys_restart_syscall(trapframe_t* tf);
|
||||
void sys_exit(trapframe_t* tf);
|
||||
void sys_fork(trapframe_t* tf);
|
||||
void sys_read(trapframe_t* tf);
|
||||
void sys_write(trapframe_t* tf);
|
||||
void sys_open(trapframe_t* tf);
|
||||
void sys_close(trapframe_t* tf);
|
||||
void sys_waitpid(trapframe_t* tf);
|
||||
void sys_creat(trapframe_t* tf);
|
||||
void sys_exec(trapframe_t* tf);
|
||||
void sys_chdir(trapframe_t* tf);
|
||||
void sys_chmod(trapframe_t* tf);
|
||||
void sys_fchmod(trapframe_t* tf);
|
||||
void sys_getcwd(trapframe_t* tf);
|
||||
void sys_sigaction(trapframe_t* tf);
|
||||
void sys_sigreturn(trapframe_t* tf);
|
||||
void sys_gettimeofday(trapframe_t* tf);
|
||||
void sys_lseek(trapframe_t* tf);
|
||||
void sys_getpid(trapframe_t* tf);
|
||||
void sys_getuid(trapframe_t* tf);
|
||||
void sys_setuid(trapframe_t* tf);
|
||||
void sys_setgid(trapframe_t* tf);
|
||||
void sys_setreuid(trapframe_t* tf);
|
||||
void sys_setregid(trapframe_t* tf);
|
||||
void sys_kill(trapframe_t* tf);
|
||||
void sys_mkdir(trapframe_t* tf);
|
||||
void sys_rmdir(trapframe_t* tf);
|
||||
void sys_unlink(trapframe_t* tf);
|
||||
void sys_mmap(trapframe_t* tf);
|
||||
void sys_munmap(trapframe_t* tf);
|
||||
void sys_dup(trapframe_t* tf);
|
||||
void sys_dup2(trapframe_t* tf);
|
||||
void sys_socket(trapframe_t* tf);
|
||||
void sys_bind(trapframe_t* tf);
|
||||
void sys_connect(trapframe_t* tf);
|
||||
void sys_getdents(trapframe_t* tf);
|
||||
void sys_ioctl(trapframe_t* tf);
|
||||
void sys_setpgid(trapframe_t* tf);
|
||||
void sys_getpgid(trapframe_t* tf);
|
||||
void sys_create_thread(trapframe_t* tf);
|
||||
void sys_sleep(trapframe_t* tf);
|
||||
void sys_select(trapframe_t* tf);
|
||||
void sys_fstat(trapframe_t* tf);
|
||||
void sys_fsync(trapframe_t* tf);
|
||||
void sys_sched_yield(trapframe_t* tf);
|
||||
void sys_uname(trapframe_t* tf);
|
||||
void sys_clock_settime(trapframe_t* tf);
|
||||
void sys_clock_gettime(trapframe_t* tf);
|
||||
void sys_clock_getres(trapframe_t* tf);
|
||||
void sys_nice(trapframe_t* tf);
|
||||
void sys_shbuf_create(trapframe_t* tf);
|
||||
void sys_shbuf_get(trapframe_t* tf);
|
||||
void sys_shbuf_free(trapframe_t* tf);
|
||||
void sys_ptrace(trapframe_t* tf);
|
||||
|
||||
void sys_none(trapframe_t* tf);
|
||||
|
||||
#endif // _KERNEL_SYSCALLS_HANDLERS_H
|
||||
36
kernel/include/syscalls/interruptible_area.h
Normal file
36
kernel/include/syscalls/interruptible_area.h
Normal file
@@ -0,0 +1,36 @@
|
||||
#ifndef _KERNEL_SYSCALLS_INTERRUPTIBLE_AREA_H
|
||||
#define _KERNEL_SYSCALLS_INTERRUPTIBLE_AREA_H
|
||||
|
||||
#include <libkern/libkern.h>
|
||||
#include <platform/generic/system.h>
|
||||
#include <tasking/cpu.h>
|
||||
|
||||
/**
|
||||
* By design the whole kernel is not interruptible, but some parts inside kernel
|
||||
* could be interrupted without any bad consequences and at the same time these
|
||||
* parts take a lot of cpu time, like copying data from/to user. We might want
|
||||
* to mark them as interruptible.
|
||||
*/
|
||||
|
||||
static ALWAYS_INLINE int interruptible_area_start()
|
||||
{
|
||||
int res = THIS_CPU->int_depth_counter;
|
||||
THIS_CPU->int_depth_counter = 0;
|
||||
system_enable_interrupts_no_counter();
|
||||
return res;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE int interruptible_area_end(int old)
|
||||
{
|
||||
system_disable_interrupts_no_counter();
|
||||
THIS_CPU->int_depth_counter = old;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef PREEMPT_KERNEL
|
||||
#define INTERRUPTIBLE_AREA for (int __i = 0, __j = interruptible_area_start(); __i < 1; interruptible_area_end(__j), __i++)
|
||||
#else
|
||||
#define INTERRUPTIBLE_AREA if (true)
|
||||
#endif
|
||||
|
||||
#endif // _KERNEL_SYSCALLS_INTERRUPTIBLE_AREA_H
|
||||
11
kernel/include/syscalls/wrapper.h
Normal file
11
kernel/include/syscalls/wrapper.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef _KERNEL_SYSCALLS_WRAPPER_H
|
||||
#define _KERNEL_SYSCALLS_WRAPPER_H
|
||||
|
||||
#define SYSCALL_INIT_VAR(p, val) p = (typeof(p))val
|
||||
#define SYSCALL_INIT_VARS1(a) SYSCALL_INIT_VAR(a, SYSCALL_VAR1(tf))
|
||||
#define SYSCALL_INIT_VARS2(a, b) SYSCALL_INIT_VAR(a, SYSCALL_VAR1(tf)), SYSCALL_INIT_VAR(b, SYSCALL_VAR2(tf))
|
||||
#define SYSCALL_INIT_VARS3(a, b, c) SYSCALL_INIT_VAR(a, SYSCALL_VAR1(tf)), SYSCALL_INIT_VAR(b, SYSCALL_VAR2(tf)), SYSCALL_INIT_VAR(c, SYSCALL_VAR3(tf))
|
||||
#define SYSCALL_INIT_VARS4(a, b, c, d) SYSCALL_INIT_VAR(a, SYSCALL_VAR1(tf)), SYSCALL_INIT_VAR(b, SYSCALL_VAR2(tf)), SYSCALL_INIT_VAR(c, SYSCALL_VAR3(tf)), SYSCALL_INIT_VAR(d, SYSCALL_VAR4(tf))
|
||||
#define SYSCALL_INIT_VARS5(a, b, c, d, e) SYSCALL_INIT_VAR(a, SYSCALL_VAR1(tf)), SYSCALL_INIT_VAR(b, SYSCALL_VAR2(tf)), SYSCALL_INIT_VAR(c, SYSCALL_VAR3(tf)), SYSCALL_INIT_VAR(d, SYSCALL_VAR4(tf)), SYSCALL_INIT_VAR(e, SYSCALL_VAR5(tf))
|
||||
|
||||
#endif // _KERNEL_SYSCALLS_WRAPPER_H
|
||||
Reference in New Issue
Block a user