Initial commit: Schunix as it stands before the SchOS rename
An x86-64 operating system built from xv6, now largely rewritten: SMP, a copy-on-write root filesystem (SchFS), PCI/USB/virtio drivers, a TTF rasteriser, and a Linux-numbered syscall ABI. No history before this point -- the tree was never under version control. This commit exists so the rename that follows has something to undo to.
This commit is contained in:
commit
d0f7acf9eb
275 changed files with 51417 additions and 0 deletions
49
include/syscall.h
Normal file
49
include/syscall.h
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
#pragma once
|
||||
|
||||
// Syscall numbers and definition macros — all derived from
|
||||
// kernel/sys/table.inc, which is the single source of truth.
|
||||
//
|
||||
// Do NOT add SYS_* constants by hand, and do NOT add anything to
|
||||
// kernel/sys/linux_abi.c: add one SYSCALL() line to table.inc and write the
|
||||
// body with SYSCALL_DEFINE(). The constant, the dispatch slot and the Linux
|
||||
// ABI mapping are all generated from that one line.
|
||||
|
||||
#define NSYSCALLS 512
|
||||
|
||||
// Scratch slot for syscalls with no Linux equivalent. Every such entry lands
|
||||
// on this one index of the translation map, which is never dispatched (Linux
|
||||
// x86_64 numbers currently top out around 450). Using a real index rather
|
||||
// than a negative sentinel keeps the generated map a plain designated
|
||||
// initialiser instead of needing a second macro.
|
||||
#define NO_LINUX 511
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
// In .S files GCC passes through the C preprocessor but the assembler
|
||||
// sees the output, so emit .set directives instead of an enum.
|
||||
#define SYSCALL(nr, lnr, name) .set SYS_##name, nr
|
||||
#define SYSCALL_ALIAS(lnr, name)
|
||||
#include "../kernel/sys/table.inc"
|
||||
#undef SYSCALL
|
||||
#undef SYSCALL_ALIAS
|
||||
#else
|
||||
// In C files generate a proper enum so constants work in switch/designators.
|
||||
enum syscall_nr {
|
||||
_SYS_RESERVED = 0,
|
||||
#define SYSCALL(nr, lnr, name) SYS_##name = (nr),
|
||||
#define SYSCALL_ALIAS(lnr, name)
|
||||
#include "../kernel/sys/table.inc"
|
||||
#undef SYSCALL
|
||||
#undef SYSCALL_ALIAS
|
||||
};
|
||||
|
||||
// Every syscall body is written as:
|
||||
//
|
||||
// SYSCALL_DEFINE(getpid)
|
||||
// {
|
||||
// return myproc()->pid;
|
||||
// }
|
||||
//
|
||||
// so the signature lives in exactly one place and every implementation is
|
||||
// findable with a single grep.
|
||||
#define SYSCALL_DEFINE(name) addr_t sys_##name(void)
|
||||
#endif
|
||||
Loading…
Reference in a new issue