SchOS/kernel/sys/linux_abi.c
Nexoniarz 26bca020b6 licence: SchOS is GPL-2.0-or-later, no longer Apache-2.0
Nexoniarz is the sole author and SchOS was never published under
Apache-2.0, so this is a straight relicence. LICENSE is the FSF GPLv2 text,
every first-party SPDX header moves to GPL-2.0-or-later, and NOTICE,
README.md, docs/licensing.md and the site say so. projects/schfs-linux
follows the rest of the tree.

The GPL gives copyleft: a fork has to ship its source. It also lifts the
old "Linux drivers, never" rule, since GPL-2.0-only code combines with
GPL-2.0-or-later. "Or later" leaves room for GPLv3, but one binary still
has to pick one version, so docs/licensing.md now keeps Apache-2.0 and
GPLv3 code out of the kernel to keep Linux code possible there. BSD
4-clause code goes from "avoid" to "no", because the advertising clause
is GPL-incompatible.

LDLS still ships no .ko. That boundary is now project policy rather than
a legal requirement, and ldls.md, devices.md and licensing.md section 6
say so. refmod declares license=GPL, and ldls-check passes (27 checks).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 08:48:45 +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 "types.h"
#include "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;