SchOS/kernel/sys/linux_abi.c
Nexoniarz a1c965da1e 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
2026-10-23 15:05:12 +02:00

33 lines
1.4 KiB
C

// SPDX-License-Identifier: GPL-2.0-or-later
// Linux x86_64 syscall number -> SchOS syscall number translation.
// Enabled per process by sys_enable_linux_abi (see kernel/sys/sys_compat.c).
//
// This file used to be the second half of a two-place registration scheme: a
// hand-written `#define LINUX_foo N` for every Linux number, plus a hand-written
// map entry pointing it at SYS_foo. Adding a syscall meant three edits across
// two files, and forgetting this one left the syscall unreachable from every
// musl-linked program while looking perfectly registered in table.inc.
//
// The map is now generated from kernel/sys/table.inc, which carries the Linux
// number alongside the native one. There is nothing to hand-edit here.
#include "core/types.h"
#include "core/syscall.h"
#define LINUX_NSYSCALL NSYSCALLS
// Index: Linux x86_64 syscall number. Value: SchOS SYS_* number, or 0 for
// "not implemented" (syscall() then returns -ENOSYS).
//
// Syscalls declared NO_LINUX in table.inc all land on the single scratch index
// NO_LINUX. They overwrite each other there, which is harmless: no real Linux
// syscall uses that number, so the slot is never dispatched.
int linux_syscall_map[LINUX_NSYSCALL] = {
#define SYSCALL(nr, lnr, name) [lnr] = SYS_##name,
#define SYSCALL_ALIAS(lnr, name) [lnr] = SYS_##name,
#include "table.inc"
#undef SYSCALL
#undef SYSCALL_ALIAS
};
int linux_syscall_map_size = LINUX_NSYSCALL;