#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