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.
49 lines
1.7 KiB
C
49 lines
1.7 KiB
C
#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
|