include: one folder per subsystem, and includes that name it
Sixty-five headers sat side by side in include/, so `#include "irq.h"` said nothing about where irq.h was or what it belonged to, and errno.h, stat.h and fcntl.h at the top shadowed the system's for any host tool built with -I./include. They are in folders now -- arch/ core/ fs/ dev/ gfx/ net/ uapi/ (and ldls/ for the Linux driver layer) -- and every include names the folder, as Linux's do: "core/proc.h". Done mechanically and checked the hard way: the kernel built from this tree disassembles identically to the one built from the tree before it. The full image boots, and userland is the same set of programs. Paths in docs and comments follow; docs/guides/layout.md has a table of what is where, and tools/fix-includes.py rewrites old-style includes from the folders in the tree, for code written before this. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S1giNvrHTrPMPw7V6x1kQ4
This commit is contained in:
parent
0e39e711f1
commit
a1c965da1e
267 changed files with 1560 additions and 1440 deletions
|
|
@ -1,49 +0,0 @@
|
|||
#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