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>
This commit is contained in:
Nexoniarz 2026-10-22 08:48:45 +02:00
commit 26bca020b6
135 changed files with 959 additions and 689 deletions

View file

@ -44,7 +44,7 @@
- [Device model](schunix-device-model.md) — one bus-agnostic list at /proc/devices; bus is provenance, class is capability, and the settled Linux-driver decision. - [Device model](schunix-device-model.md) — one bus-agnostic list at /proc/devices; bus is provenance, class is capability, and the settled Linux-driver decision.
- [usb.ids](schunix-usb-ids.md) — shipped as /usr/share/usb.ids, BSD option of a dual licence; cached, not fetched per build. - [usb.ids](schunix-usb-ids.md) — shipped as /usr/share/usb.ids, BSD option of a dual licence; cached, not fetched per build.
- [USB and xHCI](schunix-usb-xhci.md) — enumeration and control transfers work; written from the spec, because porting BSD's stack means porting newbus first. - [USB and xHCI](schunix-usb-xhci.md) — enumeration and control transfers work; written from the spec, because porting BSD's stack means porting newbus first.
- [Licensing](schunix-licensing.md) — Apache-2.0, copyright Nexoniarz; BSD drivers are usable and Linux ones are not. - [Licensing](schunix-licensing.md) — GPL-2.0-or-later since 2026-10-22 (was Apache); Linux code OK, no Apache/GPLv3 in the kernel.
- [Layout migration](schunix-layout-migration.md) — the bt/ → ports/ + lib/ + cmd/ restructure and the two Makefile traps it exposed. - [Layout migration](schunix-layout-migration.md) — the bt/ → ports/ + lib/ + cmd/ restructure and the two Makefile traps it exposed.
- [Verify by driving the shell](schunix-verify-by-driving-shell.md) — booting to a prompt proves nothing; run real commands over serial with paced input. - [Verify by driving the shell](schunix-verify-by-driving-shell.md) — booting to a prompt proves nothing; run real commands over serial with paced input.
- [/dev and /proc](schunix-devfs-procfs.md) — how both are built; ps and top work now, one cosmetic gap left. - [/dev and /proc](schunix-devfs-procfs.md) — how both are built; ps and top work now, one cosmetic gap left.

View file

@ -1,6 +1,6 @@
--- ---
name: schunix-licensing name: schunix-licensing
description: "Schunix is Apache-2.0, copyright Nexoniarz; BSD drivers yes, Linux no, and ports/ licences bind regardless" description: "SchOS is GPL-2.0-or-later since 2026-10-22 (was Apache-2.0); Linux code now allowed, but no Apache/GPLv3 code in the kernel"
metadata: metadata:
node_type: memory node_type: memory
type: project type: project
@ -8,43 +8,34 @@ metadata:
modified: 2026-08-08T16:18:39.569Z modified: 2026-08-08T16:18:39.569Z
--- ---
**`LICENSE` is Apache-2.0**, copyright *Nexoniarz* (not "Schunix Contributors" — **`LICENSE` is GPL-2.0-or-later** since 2026-10-22, copyright *Nexoniarz*, sole
one author, and a fictional collective makes future re-licensing harder). author. It was Apache-2.0 before and was never published under it. Nexoniarz
Chosen over MIT/BSD for the express patent grant. chose GPL for copyleft ("I can't be also too liberal because people just mostly
steal that work") and so Linux code can be used. They picked "or-later" over
"only" on my recommendation.
**Settled, do not reopen:** the "Apache-2.0 but shared-source" question was **The rule that replaced "Linux no":** a single linked binary has to pick one
discussed at length in 2026-08 and **on 2026-08-08 Nexoniarz asked for it to be GPL version. Linux code (GPL-2.0-only) makes it GPLv2; Apache-2.0 or GPLv3 code
dropped from the docs entirely** — `docs/licensing.md` is about licensing, not makes it GPLv3. They can't share a binary, so **the kernel takes no Apache-2.0
about that debate. All references are gone from `docs/`, `LICENSE` and `NOTICE`; or GPLv3 code**. Separate userland programs may be GPLv3 or Apache. Data files
don't reintroduce them. The substance that survives, in one line inside §1: such as Roboto (Apache-2.0) are aggregation, and that holds inside the ramdisk
Apache-2.0 §2 is an irrevocable grant, so a restriction stated anywhere else too. BSD 4-clause code is now a hard **no** (GPL-incompatible).
does not narrow it, and restricting distribution would be a licence change
(bespoke proprietary, or BUSL-1.1) rather than a wording change.
The decision that actually mattered to them is **when to publish**, not the **LDLS still ships no `.ko`.** That is policy now, not a legal requirement. The
licence; the standing rule is still never ([[nexoniarz-sharing-preference]]). `.gitignore` `*.ko` rule and `RAMDISK_EXCLUDE` stay.
**Binding regardless of what they pick:** **Settled, do not reopen:** the old "Apache-2.0 but shared-source" debate was
- The kernel derives from xv6 (MIT). `LICENSE.MIT` was *missing* — it was dropped from the docs on 2026-08-08. The question that matters to them is when
referenced as `bk/LICENSE.MIT` and lost in the `bk/` → `kernel/` migration. to publish, and the standing answer is still never
Recreated; must not be deleted. ([[nexoniarz-sharing-preference]]).
- `ports/` is other people's code, redistributed in every image: musl (MIT),
toybox (0BSD), mksh (MirOS). `NOTICE` carries the attribution musl and mksh
require. Patches under `ports/*/patches/` inherit *their* licences.
New first-party files carry `// SPDX-License-Identifier: Apache-2.0`. **Binding regardless:**
- The kernel derives from xv6 (MIT). `LICENSE.MIT` must not be deleted.
- `ports/` is other people's code: musl, toybox, mksh, zsh, ncurses, lwIP,
kilo and fastfetch are all permissive. `NOTICE` carries the attributions.
**Drivers: BSD yes, Linux no** (asked 2026-08-04, "for drivers we can try get New first-party files carry `// SPDX-License-Identifier: GPL-2.0-or-later`.
it from like Linux?"). Linux is GPL-2.0-**only**, and Apache-2.0's patent and The policy is in `docs/licensing.md`. See [[schunix-roadmap-and-projects]].
indemnity clauses are "further restrictions" under GPLv2 §6 — the two cannot
be combined and redistributed. Using a Linux driver means relicensing all of
Schunix to GPLv2 and dropping Apache-2.0; you cannot keep both. FreeBSD /
NetBSD / OpenBSD are BSD-2/3-clause and **are** compatible: keep the notice,
add to `NOTICE`, done. Reading Linux to understand hardware is fine;
translating a driver function-by-function produces a derivative work whatever
the identifiers say. Best source of all is the public specification — xHCI,
virtio, AHCI, NVMe, e1000 — which carries no licence on what you write from
it. Recorded in `docs/plan/roadmap.md` §1. See [[schunix-roadmap-and-projects]].
## fs.c is third-party, and was unattributed until 2026-08-09 ## fs.c is third-party, and was unattributed until 2026-08-09

5
.gitignore vendored
View file

@ -45,7 +45,8 @@ docs/Website/releases/
# Kernel modules, ever. docs/plan/ldls.md rule 1: LDLS ships the layer and # Kernel modules, ever. docs/plan/ldls.md rule 1: LDLS ships the layer and
# never the thing it loads, and that applies to this tree as well as to an # never the thing it loads, and that applies to this tree as well as to an
# image. The loader's test input is built from ldls/test/refmod.c, which is # image. The loader's test input is built from ldls/test/refmod.c, which is
# ours; a .ko here would be someone else's GPL code in an Apache-2.0 repo. # ours; a .ko here would be someone else's code, with its own provenance, in
# a tree that is otherwise all first-party or attributed in NOTICE.
*.ko *.ko
*.ko.xz *.ko.xz
@ -59,7 +60,7 @@ core.*
# #
# help/ is where a third-party kernel gets cloned when it is worth reading -- # help/ is where a third-party kernel gets cloned when it is worth reading --
# Zircon, at the time of writing. It is BSD-licensed and this project is # Zircon, at the time of writing. It is BSD-licensed and this project is
# Apache-2.0, so the licences are compatible and that is *not* the reason it is # GPL-2.0-or-later, so the licences are compatible and that is *not* the reason it is
# ignored: it is ignored because a copy of another project's source inside this # ignored: it is ignored because a copy of another project's source inside this
# one is a copy that will rot, that nobody will update, and that makes the # one is a copy that will rot, that nobody will update, and that makes the
# provenance of every file around it a question. Clone it, read it, learn the # provenance of every file around it a question. Clone it, read it, learn the

462
LICENSE
View file

@ -1,187 +1,339 @@
Apache License GNU GENERAL PUBLIC LICENSE
Version 2.0, January 2004 Version 2, June 1991
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
1. Definitions. Preamble
"License" shall mean the terms and conditions for use, reproduction, The licenses for most software are designed to take away your
and distribution as defined by Sections 1 through 9 of this document. freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
"Licensor" shall mean the copyright owner or entity authorized by When we speak of free software, we are referring to freedom, not
the copyright owner that is granting the License. price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
"Legal Entity" shall mean the union of the acting entity and all To protect your rights, we need to make restrictions that forbid
other entities that control, are controlled by, or are under common anyone to deny you these rights or to ask you to surrender the rights.
control with that entity. For the purposes of this definition, These restrictions translate to certain responsibilities for you if you
"control" means (i) the power, direct or indirect, to cause the distribute copies of the software, or if you modify it.
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity For example, if you distribute copies of such a program, whether
exercising permissions granted by this License. gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
"Source" form shall mean the preferred form for making modifications, We protect your rights with two steps: (1) copyright the software, and
including but not limited to software source code, documentation (2) offer you this license which gives you legal permission to copy,
source, and configuration files. distribute and/or modify the software.
"Object" form shall mean any form resulting from mechanical Also, for each author's protection and ours, we want to make certain
transformation or translation of a Source form, including but that everyone understands that there is no warranty for this free
not limited to compiled object code, generated documentation, software. If the software is modified by someone else and passed on, we
and conversions to other media types. want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
"Work" shall mean the work of authorship made available under Finally, any free program is threatened constantly by software
the License, as indicated by a copyright notice that is included in patents. We wish to avoid the danger that redistributors of a free
or attached to the work (an example is provided in the Appendix below). program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
"Derivative Works" shall mean any work, whether in Source or Object The precise terms and conditions for copying, distribution and
form, that is based on (or derived from) the Work and for which the modification follow.
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean, as submitted to the Licensor for inclusion GNU GENERAL PUBLIC LICENSE
in the Work by the copyright owner or by an individual or Legal Entity TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
authorized to submit on behalf of the copyright owner. For the purposes
of this definition, "contribution" means any work of authorship,
including the original version of the Work and any modifications or
additions to that Work or Derivative Works of the Work.
"Contributor" shall mean Licensor and any Legal Entity on behalf of 0. This License applies to any program or other work which contains
whom a Contribution has been received by the Licensor and included a notice placed by the copyright holder saying it may be distributed
within the Work. under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
2. Grant of Copyright License. Subject to the terms and conditions of Activities other than copying, distribution and modification are not
this License, each Contributor hereby grants to You a perpetual, covered by this License; they are outside its scope. The act of
worldwide, non-exclusive, no-charge, royalty-free, irrevocable running the Program is not restricted, and the output from the Program
copyright license to reproduce, prepare Derivative Works of, is covered only if its contents constitute a work based on the
publicly display, publicly perform, sublicense, and distribute the Program (independent of having been made by running the Program).
Work and such Derivative Works in Source or Object form. Whether that is true depends on what the Program does.
3. Grant of Patent License. Subject to the terms and conditions of 1. You may copy and distribute verbatim copies of the Program's
this License, each Contributor hereby grants to You a perpetual, source code as you receive it, in any medium, provided that you
worldwide, non-exclusive, no-charge, royalty-free, irrevocable conspicuously and appropriately publish on each copy an appropriate
(except as stated in this section) patent license to make, have made, copyright notice and disclaimer of warranty; keep intact all the
use, offer to sell, sell, import, and otherwise transfer the Work, notices that refer to this License and to the absence of any warranty;
where such license applies only to those patent claims licensable and give any other recipients of the Program a copy of this License
by such Contributor that are necessarily infringed by their along with the Program.
Contribution(s) alone or by the combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a cross-claim
or counterclaim in a lawsuit) alleging that the Work or any
Contribution embodied within the Work constitutes patent or
contributory patent infringement, then any patent licenses granted to
You under this License for that Work shall terminate as of the date
such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the You may charge a fee for the physical act of transferring a copy, and
Work or Derivative Works thereof in any medium, with or without you may at your option offer warranty protection in exchange for a fee.
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or 2. You may modify your copy or copies of the Program or any portion
Derivative Works a copy of this License; and of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
(b) You must cause any modified files to carry prominent notices a) You must cause the modified files to carry prominent notices
stating that You changed the files; and stating that you changed the files and the date of any change.
(c) You must retain, in the Source form of any Derivative Works b) You must cause any work that you distribute or publish, that in
that You distribute, all copyright, patent, trademark, and whole or in part contains or is derived from the Program or any
attribution notices from the Source form of the Work, part thereof, to be licensed as a whole at no charge to all third
excluding those notices that do not pertain to any part of parties under the terms of this License.
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its c) If the modified program normally reads commands interactively
distribution, You must include a readable copy of the when run, you must cause it, when started running for such
attribution notices contained within such NOTICE file, in interactive use in the most ordinary way, to print or display an
at least one of the following places: within a NOTICE text announcement including an appropriate copyright notice and a
file distributed as part of the Derivative Works; within notice that there is no warranty (or else, saying that you provide
the Source form or documentation, if provided along with the a warranty) and that users may redistribute the program under
Derivative Works; or, within a display generated by the these conditions, and telling the user how to view a copy of this
Derivative Works, if and wherever such third-party notices License. (Exception: if the Program itself is interactive but
normally appear. The contents of the NOTICE file are for does not normally print such an announcement, your work based on
informational purposes only and do not modify the License. the Program is not required to print an announcement.)
You may add Your own attribution notices within Derivative
Works that You distribute, alongside or in addition to the
NOTICE text from the Work, provided that such additional
attribution notices cannot be construed as modifying the License.
You may add Your own license statement for Your modifications and These requirements apply to the modified work as a whole. If
may provide additional grant of rights to use, copy, modify, and identifiable sections of that work are not derived from the Program,
distribute those modifications as a separate work, subject to the and can be reasonably considered independent and separate works in
terms and conditions of this License. themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
5. Submission of Contributions. Unless You explicitly state otherwise, Thus, it is not the intent of this section to claim rights or contest
any Contribution intentionally submitted for inclusion in the Work your rights to work written entirely by you; rather, the intent is to
by You to the Licensor shall be under the terms and conditions of exercise the right to control the distribution of derivative or
this License, without any additional terms or conditions. collective works based on the Program.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade In addition, mere aggregation of another work not based on the Program
names, trademarks, service marks, or product names of the Licensor, with the Program (or with a work based on the Program) on a volume of
except as required for reasonable and customary use in describing the a storage or distribution medium does not bring the other work under
origin of the Work and reproducing the content of the NOTICE file. the scope of this License.
7. Disclaimer of Warranty. Unless required by applicable law or 3. You may copy and distribute the Program (or a work based on it,
agreed to in writing, Licensor provides the Work (and each under Section 2) in object code or executable form under the terms of
Contributor provides its Contributions) on an "AS IS" BASIS, Sections 1 and 2 above provided that you also do one of the following:
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any conditions of TITLE,
NONINFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.
You are solely responsible for determining the appropriateness of
using or reproducing the Work and assume any risks associated with
Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory, a) Accompany it with the complete corresponding machine-readable
whether in tort (including negligence), contract, or otherwise, source code, which must be distributed under the terms of Sections
unless required by applicable law (such as deliberate and grossly 1 and 2 above on a medium customarily used for software interchange; or,
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or exemplary damages of any character arising as a
result of this License or out of the use or inability to use the
Work (even if such Contributor has been advised of the possibility
of such damages).
9. Accepting Warranty or Additional Liability. While redistributing b) Accompany it with a written offer, valid for at least three
the Work or Derivative Works thereof, You may choose to offer, years, to give any third party, for a charge no more than your
and charge a fee for, acceptance of support, warranty, indemnity, cost of physically performing source distribution, a complete
or other liability obligations and/or rights consistent with this machine-readable copy of the corresponding source code, to be
License. However, in accepting such obligations, You may offer such distributed under the terms of Sections 1 and 2 above on a medium
obligations only on Your behalf and on Your sole responsibility, customarily used for software interchange; or,
not on behalf of any other Contributor, and only if You agree to
indemnify, defend, and hold each Contributor harmless for any
liability incurred by, or claims asserted against, such Contributor
by reason of your accepting any warranty or additional liability.
END OF TERMS AND CONDITIONS c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
Copyright 2026 Nexoniarz The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
Licensed under the Apache License, Version 2.0 (the "License"); If distribution of executable or object code is made by offering
you may not use this file except in compliance with the License. access to copy from a designated place, then offering equivalent
You may obtain a copy of the License at access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
http://www.apache.org/licenses/LICENSE-2.0 4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
Unless required by applicable law or agreed to in writing, software 5. You are not required to accept this License, since you have not
distributed under the License is distributed on an "AS IS" BASIS, signed it. However, nothing else grants you permission to modify or
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. distribute the Program or its derivative works. These actions are
See the License for the specific language governing permissions and prohibited by law if you do not accept this License. Therefore, by
limitations under the License. modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
NOTE: The kernel (kernel/) is derived from xv6 (MIT License, Copyright 6. Each time you redistribute the Program (or any work based on the
2006-2019 Frans Kaashoek, Robert Morris, Russ Cox, M.I.T. CSAIL). Program), the recipient automatically receives a license from the
The MIT license notice is preserved in LICENSE.MIT and must not be original licensor to copy, distribute or modify the Program subject to
removed. Third-party software redistributed in a built image -- musl, these terms and conditions. You may not impose any further
toybox and mksh, all under ports/ -- keeps its own license; see NOTICE. restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
Which outside code may be copied into SchOS and which may not -- the 7. If, as a consequence of a court judgment or allegation of patent
BSD/GPL rules, the NetBSD advertising clause, and what is deliberately infringement or for any other reason (not limited to patent issues),
never shipped -- is written up in docs/licensing.md. Read it before conditions are imposed on you (whether by court order, agreement or
copying anyone else's code in. otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View file

@ -455,8 +455,8 @@ RAMDISK_BLOCKS ?= 8000
# rule before it is a size one: the ramdisk image is linked *into the kernel # rule before it is a size one: the ramdisk image is linked *into the kernel
# binary*, so anything staged in sysroot/ when it is built becomes part of a # binary*, so anything staged in sysroot/ when it is built becomes part of a
# distributable artifact. Anything that arrives in sysroot/ under a licence that # distributable artifact. Anything that arrives in sysroot/ under a licence that
# cannot be combined with Apache-2.0, or that simply is not ours to redistribute, # cannot be combined with GPL-2.0-or-later, or that simply is not ours to
# belongs on this list rather than in someone's memory. # redistribute, belongs on this list rather than in someone's memory.
# #
# This is not hypothetical: a 33 MB test payload once landed here and overflowed # This is not hypothetical: a 33 MB test payload once landed here and overflowed
# the 6 MB image, and mkfs's "increase FSSIZE" message then pointed at a constant # the 6 MB image, and mkfs's "increase FSSIZE" message then pointed at a constant

23
NOTICE
View file

@ -2,7 +2,8 @@ SchOS
Copyright 2026 Nexoniarz Copyright 2026 Nexoniarz
This product includes software developed as part of the SchOS project, This product includes software developed as part of the SchOS project,
licensed under the Apache License, Version 2.0. See LICENSE. licensed under the GNU General Public License, version 2 or (at your option)
any later version. See LICENSE.
================================================================================ ================================================================================
Third-party software Third-party software
@ -118,9 +119,9 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Fetched by ports/lwip and compiled into the kernel -- it is the TCP/IP stack, Fetched by ports/lwip and compiled into the kernel -- it is the TCP/IP stack,
not a userland library, so it is present in every built kernel image rather not a userland library, so it is present in every built kernel image rather
than in a binary under /bin. The port layer written for SchOS than in a binary under /bin. The port layer written for SchOS
(kernel/net/lwip/) is Apache-2.0 and is not part of lwIP; lwIP's own sources (kernel/net/lwip/) is GPL-2.0-or-later and is not part of lwIP; lwIP's own
are unmodified. Clause 3 is a no-endorsement term, not the four-clause sources are unmodified. Clause 3 is a no-endorsement term, not the four-clause
advertising requirement, so it combines with Apache-2.0 without difficulty. advertising requirement, so it combines with the GPL without difficulty.
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Intel 8254x device identifiers BSD 3-Clause Intel 8254x device identifiers BSD 3-Clause
@ -149,9 +150,8 @@ http://www.linux-usb.org/usb.ids
Distributed by its maintainer under the terms of *either* the GNU General Distributed by its maintainer under the terms of *either* the GNU General
Public License version 2 or later, *or* the 3-clause BSD Licence. SchOS takes Public License version 2 or later, *or* the 3-clause BSD Licence. SchOS takes
the BSD option; the GPL option is not exercised and could not be, since the BSD option, which was chosen while SchOS was Apache-2.0; either option is
Apache-2.0 and GPL-2.0-only cannot be combined (see docs/licensing.md section compatible now, and the BSD one is kept because it asks less of anyone.
2).
Shipped verbatim as /usr/share/usb.ids. Cached in dist/ and refreshed with Shipped verbatim as /usr/share/usb.ids. Cached in dist/ and refreshed with
`make usb-ids`, never automatically -- the version and date are in the file's `make usb-ids`, never automatically -- the version and date are in the file's
@ -163,9 +163,10 @@ Roboto Apache-2.0
Copyright the Roboto Project Authors (https://github.com/googlefonts/roboto) Copyright the Roboto Project Authors (https://github.com/googlefonts/roboto)
Shipped as /usr/share/fonts/Roboto-Regular.ttf, from ports/Roboto. Licensed Shipped as /usr/share/fonts/Roboto-Regular.ttf, from ports/Roboto. Licensed
under Apache-2.0 -- the same licence as SchOS itself, so it carries no under Apache-2.0. It is a separate data file loaded at run time, not code
obligation beyond this notice. Intended for the desktop, window manager and linked into SchOS, so it sits beside the GPL as an aggregate and keeps its own
compositor. licence; the obligation is this notice. Intended for the desktop, window
manager and compositor.
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
JetBrains Mono SIL OFL 1.1 JetBrains Mono SIL OFL 1.1
@ -178,7 +179,7 @@ Shipped as /usr/share/fonts/JetBrainsMono-Regular.ttf, from ports/JetBrains_Mono
and TTY. and TTY.
Under the SIL Open Font License 1.1 the font remains under OFL even inside this Under the SIL Open Font License 1.1 the font remains under OFL even inside this
Apache-2.0 system -- that does not reach any other part of SchOS -- and it may GPL-licensed system -- that does not reach any other part of SchOS -- and it may
not be sold on its own. Bundling it with an operating system is expressly not be sold on its own. Bundling it with an operating system is expressly
permitted. JetBrains Mono declares no Reserved Font Name, so a modified version permitted. JetBrains Mono declares no Reserved Font Name, so a modified version
(a pre-rasterised bitmap, for instance) may keep the name. (a pre-rasterised bitmap, for instance) may keep the name.

View file

@ -150,20 +150,17 @@ Another: **syscalls are declared in exactly one place**,
## Licensing ## Licensing
**Apache-2.0**, copyright Nexoniarz. See [LICENSE](LICENSE). **GPL-2.0-or-later**, copyright Nexoniarz. See [LICENSE](LICENSE).
The kernel derives from xv6, which is MIT — see [LICENSE.MIT](LICENSE.MIT). The kernel derives from xv6, which is MIT — see [LICENSE.MIT](LICENSE.MIT).
Third-party code redistributed in a built image (musl, toybox, mksh, zsh, kilo, Third-party code redistributed in a built image (musl, toybox, mksh, zsh, kilo,
the fonts) keeps its own licence; [NOTICE](NOTICE) carries the attributions. the fonts) keeps its own licence; [NOTICE](NOTICE) carries the attributions.
All of it is permissive — there is no GPL in an image this builds, which is why See [docs/licensing.md](docs/licensing.md).
the userland is toybox and not BusyBox and the editor is kilo and not nano. See
[docs/licensing.md](docs/licensing.md).
Drivers may be adapted from BSD sources, which are compatible. Linux drivers are Drivers may be adapted from BSD sources and, since the move to the GPL, from
not: GPL-2.0-only and Apache-2.0 cannot be combined and redistributed. Reading Linux — GPL-2.0-only code combines with GPL-2.0-or-later, and the result ships
Linux to understand hardware is fine; translating a driver is not. Best of all under GPLv2. Best of all is still the public specification — xHCI, virtio,
is the public specification — xHCI, virtio, AHCI, e1000 — which carries no AHCI, e1000 — which carries no licence on what you write from it.
licence on what you write from it.
--- ---

View file

@ -1,4 +1,4 @@
<!-- SPDX-License-Identifier: Apache-2.0 --> <!-- SPDX-License-Identifier: GPL-2.0-or-later -->
# Booting SchOS # Booting SchOS
One firmware path: One firmware path:

View file

@ -1,4 +1,4 @@
/* SPDX-License-Identifier: Apache-2.0 */ /* SPDX-License-Identifier: GPL-2.0-or-later */
/* /*
* The loader's user interface. See ui.h for why this can be shared at all. * The loader's user interface. See ui.h for why this can be shared at all.
* *

View file

@ -1,4 +1,4 @@
/* SPDX-License-Identifier: Apache-2.0 */ /* SPDX-License-Identifier: GPL-2.0-or-later */
/* /*
* The loader's user interface, shared by both firmwares. * The loader's user interface, shared by both firmwares.
* *

View file

@ -1,4 +1,4 @@
<!-- SPDX-License-Identifier: Apache-2.0 --> <!-- SPDX-License-Identifier: GPL-2.0-or-later -->
# UEFI loader # UEFI loader
The loader. This directory once existed only so the BIOS path could be moved The loader. This directory once existed only so the BIOS path could be moved

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
#ifndef SCHOS_EFI_H #ifndef SCHOS_EFI_H
#define SCHOS_EFI_H #define SCHOS_EFI_H

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// SchOS UEFI loader. // SchOS UEFI loader.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// chvt N -- show virtual terminal N. // chvt N -- show virtual terminal N.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// httpd -- serve a directory over HTTP. // httpd -- serve a directory over HTTP.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// ldlsd -- LDLS, on SchOS. // ldlsd -- LDLS, on SchOS.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// loadkeys -- choose the keyboard layout. // loadkeys -- choose the keyboard layout.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// memfdtest -- two processes map the same memfd, one writes, the other sees it. // memfdtest -- two processes map the same memfd, one writes, the other sees it.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// netecho -- a network, in a process. // netecho -- a network, in a process.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// pcitest -- prove that a driver could live out here. // pcitest -- prove that a driver could live out here.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// ping -- ICMP echo, over a SchOS ping socket. // ping -- ICMP echo, over a SchOS ping socket.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// resolvconf -- put the nameserver where the resolver will look. // resolvconf -- put the nameserver where the resolver will look.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// schdbg -- ask the kernel a question. // schdbg -- ask the kernel a question.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// schdbgd -- the debugger, over the network. // schdbgd -- the debugger, over the network.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// schinit -- PID 1. // schinit -- PID 1.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// schinitd -- the supervisor. PID 2, and restartable. // schinitd -- the supervisor. PID 2, and restartable.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// schmode -- change the display mode. // schmode -- change the display mode.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// sigtest -- the SIGCHLD/sigsuspend contract every shell is built on. // sigtest -- the SIGCHLD/sigsuspend contract every shell is built on.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// vgpud -- the virtio-gpu driver, outside the kernel. // vgpud -- the virtio-gpu driver, outside the kernel.
// //

View file

@ -1,4 +1,4 @@
<!-- SPDX-License-Identifier: Apache-2.0 --> <!-- SPDX-License-Identifier: GPL-2.0-or-later -->
# The website # The website
Three pages, two scripts, one stylesheet of its own, and the design system Three pages, two scripts, one stylesheet of its own, and the design system

View file

@ -1,4 +1,4 @@
/* SPDX-License-Identifier: Apache-2.0 */ /* SPDX-License-Identifier: GPL-2.0-or-later */
/* ========================================================================== /* ==========================================================================
The SchOS site — layout only The SchOS site — layout only
-------------------------------------------------------------------------- --------------------------------------------------------------------------

View file

@ -1,4 +1,4 @@
/* SPDX-License-Identifier: Apache-2.0 /* SPDX-License-Identifier: GPL-2.0-or-later
* *
* Three behaviours, no framework: * Three behaviours, no framework:
* 1. the hero console types a real boot log * 1. the hero console types a real boot log

View file

@ -77,7 +77,7 @@
<div class="nv-divider"></div> <div class="nv-divider"></div>
<div class="site-footer__row"> <div class="site-footer__row">
<span class="nv-body">SchOS — kernel <b>SchIFT</b>, filesystem <b>SchFS</b>.</span> <span class="nv-body">SchOS — kernel <b>SchIFT</b>, filesystem <b>SchFS</b>.</span>
<span class="nv-code nv-text-tertiary">Apache-2.0, with the xv6-derived core under MIT.</span> <span class="nv-code nv-text-tertiary">GPL-2.0-or-later, with the xv6-derived core under MIT.</span>
</div> </div>
<p class="nv-body nv-text-secondary pride-note" id="pride-note"> <p class="nv-body nv-text-secondary pride-note" id="pride-note">

View file

@ -1,4 +1,4 @@
/* SPDX-License-Identifier: Apache-2.0 /* SPDX-License-Identifier: GPL-2.0-or-later
* *
* The documentation reader. * The documentation reader.
* *

View file

@ -283,7 +283,7 @@
<div class="nv-divider"></div> <div class="nv-divider"></div>
<div class="site-footer__row"> <div class="site-footer__row">
<span class="nv-body">SchOS — kernel <b>SchIFT</b>, filesystem <b>SchFS</b>.</span> <span class="nv-body">SchOS — kernel <b>SchIFT</b>, filesystem <b>SchFS</b>.</span>
<span class="nv-code nv-text-tertiary">Apache-2.0, with the xv6-derived core under MIT.</span> <span class="nv-code nv-text-tertiary">GPL-2.0-or-later, with the xv6-derived core under MIT.</span>
</div> </div>
<p class="nv-body nv-text-secondary pride-note" id="pride-note"> <p class="nv-body nv-text-secondary pride-note" id="pride-note">

View file

@ -92,7 +92,7 @@
<a class="nv-button nv-button--lg" href="#what">What it has</a> <a class="nv-button nv-button--lg" href="#what">What it has</a>
</div> </div>
<p class="nv-caption">Apache-2.0 · runs from RAM · writes nothing to your disks</p> <p class="nv-caption">GPL-2.0-or-later · runs from RAM · writes nothing to your disks</p>
</div> </div>
<div class="nv-card nv-card--flush console" aria-label="Boot log"> <div class="nv-card nv-card--flush console" aria-label="Boot log">
@ -642,7 +642,7 @@
<div class="nv-divider"></div> <div class="nv-divider"></div>
<div class="site-footer__row"> <div class="site-footer__row">
<span class="nv-body">SchOS — kernel <b>SchIFT</b>, filesystem <b>SchFS</b>.</span> <span class="nv-body">SchOS — kernel <b>SchIFT</b>, filesystem <b>SchFS</b>.</span>
<span class="nv-code nv-text-tertiary">Apache-2.0, with the xv6-derived core under MIT.</span> <span class="nv-code nv-text-tertiary">GPL-2.0-or-later, with the xv6-derived core under MIT.</span>
</div> </div>
<p class="nv-body nv-text-secondary pride-note" id="pride-note"> <p class="nv-body nv-text-secondary pride-note" id="pride-note">

View file

@ -1,4 +1,4 @@
<!-- SPDX-License-Identifier: Apache-2.0 --> <!-- SPDX-License-Identifier: GPL-2.0-or-later -->
# Audio # Audio
A program that wants to make a sound opens `/dev/dsp`, writes PCM to it, and A program that wants to make a sound opens `/dev/dsp`, writes PCM to it, and

View file

@ -247,10 +247,11 @@ manager or equivalent, and SchOS will load it.
The licensing reasoning matters and is worth stating exactly, because it is The licensing reasoning matters and is worth stating exactly, because it is
easy to get wrong in both directions: easy to get wrong in both directions:
- **Distribution is what triggers the GPL.** Shipping a GPL-2.0-only driver in - **Distribution is what triggers the GPL.** SchOS is GPL-2.0-or-later, so
an Apache-2.0 image is what cannot be done — see [../licensing.md](../licensing.md) shipping a GPL-2.0-only driver in an image is now *possible* — see
§2. A user obtaining a driver themselves and loading it on their own machine [../licensing.md](../licensing.md) §6 — but LDLS still does not, by policy. A
is their act, not ours, and is not a distribution by us. user obtaining a driver themselves and loading it on their own machine is
their act, not ours, and is not a distribution by us.
- **Implementing a loader is not copying.** Writing support for a module format - **Implementing a loader is not copying.** Writing support for a module format
and a driver ABI from published documentation produces our own work. It is a and a driver ABI from published documentation produces our own work. It is a
clean-room implementation, and it stays one only if it is written from clean-room implementation, and it stays one only if it is written from
@ -259,8 +260,8 @@ easy to get wrong in both directions:
identifiers say. identifiers say.
So the rule for this subsystem is the same as everywhere else in the tree: the So the rule for this subsystem is the same as everywhere else in the tree: the
loader is ours and Apache-2.0, what it loads is the user's business, and nothing loader is ours and GPL-2.0-or-later, what it loads is the user's business, and
GPL ever enters an image we build. `RAMDISK_EXCLUDE` and `NOTPORTS` are the no third-party module enters an image we build. `RAMDISK_EXCLUDE` and `NOTPORTS` are the
existing mechanisms for keeping that true mechanically rather than by intention. existing mechanisms for keeping that true mechanically rather than by intention.
--- ---

View file

@ -54,9 +54,10 @@ ships the layer and never the thing it loads. `.gitignore` refuses `*.ko`,
is deliberately not part of `all`, and `make ldls-unstage` takes it out again. is deliberately not part of `all`, and `make ldls-unstage` takes it out again.
[../licensing.md](../licensing.md) §6 is the whole argument. The short form is [../licensing.md](../licensing.md) §6 is the whole argument. The short form is
that GPL obligations attach to *distribution*, we distribute Apache-2.0 code that the combination happens in a user process on the user's machine, so no
containing no GPL, and the combination happens in a user process on the user's combined work is distributed by anyone. Since SchOS moved to GPL-2.0-or-later
machine — so no combined work is distributed by anyone. that is no longer the only way it *could* be done — it is the way it is done,
because a module we never ship is a module we never have to answer for.
### 2. It runs in a process, never in the kernel ### 2. It runs in a process, never in the kernel

View file

@ -1,4 +1,4 @@
<!-- SPDX-License-Identifier: Apache-2.0 --> <!-- SPDX-License-Identifier: GPL-2.0-or-later -->
# Virtual terminals # Virtual terminals
Six of them, `/dev/tty1` through `/dev/tty6`. Six of them, `/dev/tty1` through `/dev/tty6`.

View file

@ -55,7 +55,7 @@ the kernel's name (**SchIFT**) as a shape.
coverage mask carries none, so the loader draws it in metal and the kernel in coverage mask carries none, so the loader draws it in metal and the kernel in
the theme accent, from the same bytes. the theme accent, from the same bytes.
- **With or without a wordmark.** Set "SchOS" beside it in **Roboto Bold**, - **With or without a wordmark.** Set "SchOS" beside it in **Roboto Bold**,
which is already in the tree (`ports/Roboto`), already Apache-2.0, and already which is already in the tree (`ports/Roboto`), Apache-2.0, and already
in `NOTICE`. in `NOTICE`.
- Non-human and non-animal, permanently. If a character is ever drawn it gets - Non-human and non-animal, permanently. If a character is ever drawn it gets
its own mark; a logo that starts growing a face has taken that job. its own mark; a logo that starts growing a face has taken that job.

View file

@ -1,4 +1,4 @@
<!-- SPDX-License-Identifier: Apache-2.0 --> <!-- SPDX-License-Identifier: GPL-2.0-or-later -->
# Building SchOS # Building SchOS
Supported hosts: **Linux, macOS, FreeBSD/OpenBSD/NetBSD, and Windows** (under Supported hosts: **Linux, macOS, FreeBSD/OpenBSD/NetBSD, and Windows** (under

View file

@ -130,8 +130,8 @@ file protocol, so a 6 MB ramroot kernel is visibly slower to start than the
**What may go in it is a licensing question, not only a size one.** The image is **What may go in it is a licensing question, not only a size one.** The image is
linked into the kernel binary, so anything in `sysroot/` when it is built becomes linked into the kernel binary, so anything in `sysroot/` when it is built becomes
part of a distributable artifact. A file staged there under a licence that part of a distributable artifact. A file staged there under a licence that
cannot be combined with Apache-2.0 does not merely ride along — it makes the is not ours to redistribute does not merely ride along — it makes the kernel
kernel itself undistributable. `RAMDISK_EXCLUDE` in the Makefile is the list of itself undistributable. `RAMDISK_EXCLUDE` in the Makefile is the list of
paths kept out, and enforcing it in the build rather than relying on someone paths kept out, and enforcing it in the build rather than relying on someone
remembering to unstage something first is deliberate. It has been needed once remembering to unstage something first is deliberate. It has been needed once
already: a 33 MB test payload landed in `sysroot/` and both overflowed the image already: a 33 MB test payload landed in `sysroot/` and both overflowed the image

View file

@ -1,4 +1,4 @@
<!-- SPDX-License-Identifier: Apache-2.0 --> <!-- SPDX-License-Identifier: GPL-2.0-or-later -->
# Moving the project to a Linux machine # Moving the project to a Linux machine
**This move happened.** The tree lives on Fedora now, and the checkout is at **This move happened.** The tree lives on Fedora now, and the checkout is at

View file

@ -7,24 +7,31 @@ pointed here long before this file existed.
--- ---
## 1. SchOS is Apache-2.0 ## 1. SchOS is GPL-2.0-or-later
Copyright Nexoniarz. See `LICENSE`. Copyright Nexoniarz. See `LICENSE`. Until 2026-10 SchOS was Apache-2.0; it was
never published under that licence, and as the sole author Nexoniarz relicensed
it outright.
Apache-2.0 was chosen over MIT/BSD for one reason that actually matters at OS **Why the GPL.** Two reasons, one about others and one about us:
scale: it contains an **express patent grant** and a patent-retaliation clause.
MIT and BSD are silent on patents, which means a contributor can hand you code
and later assert a patent over it. For a kernel that is intended to accept
outside contributions, that silence is the expensive kind.
What that grant means in practice: Apache-2.0 §2 gives everyone a perpetual, - **Copyleft.** Anyone may use, study, modify and redistribute SchOS — but
worldwide, irrevocable licence to reproduce, modify, sublicense and distribute whoever ships it, or something built from it, must ship the source of that
SchOS. Any additional restriction stated elsewhere — in a README, a website, too, under the same terms. Under Apache-2.0 a fork could be closed and sold
or a policy — does not narrow it. The licence text is what holds up. with no changes given back. The GPL does not forbid commercial use; it forbids
taking the work private.
- **Linux.** Linux is GPL-2.0-only, and Apache-2.0 could not be combined with
it. Under the GPL, Linux drivers and code can be adopted (§2).
If restricted distribution is ever genuinely wanted, that is a licence change **Why "or later".** It keeps one door open that "only" would close: GPLv3 and
(a bespoke proprietary licence, or something like BUSL-1.1 with a conversion Apache-2.0 code can still be combined with SchOS code, with that combination
date), not a wording change, and it means giving up the Apache grant. shipping under GPLv3. See §2 for why the kernel should not walk through it.
**What was given up.** Apache-2.0 had an express patent grant; GPLv2 has only
an implied one. That mattered most for outside contributions, and there are
none yet.
New first-party files carry `SPDX-License-Identifier: GPL-2.0-or-later`.
--- ---
@ -36,37 +43,32 @@ date), not a wording change, and it means giving up the Apache grant.
| MIT, ISC | **Yes** | Keep the notice | | MIT, ISC | **Yes** | Keep the notice |
| BSD 2-clause | **Yes** | Keep the notice | | BSD 2-clause | **Yes** | Keep the notice |
| BSD 3-clause | **Yes** | Keep the notice; no endorsement claims | | BSD 3-clause | **Yes** | Keep the notice; no endorsement claims |
| BSD **4-clause** (advertising) | **Avoid** — see §3 | Notice *and* an acknowledgement in advertising materials | | BSD **4-clause** (advertising) | **No** — see §3 | GPL-incompatible |
| Apache-2.0 | **Yes** | Keep NOTICE contents | | GPL-2.0-only, GPL-2.0-or-later, LGPL-2.1 | **Yes** | Source for the combined work; keep the notices |
| MPL-2.0 | Case by case | File-level copyleft; keep those files separate | | MPL-2.0 | Case by case | Compatible through its secondary-licence clause, unless marked otherwise |
| **GPL-2.0-only** | **No** | — | | Apache-2.0, GPL-3.0, LGPL-3.0 | **Not in the kernel**; separate programs and files fine | See below |
| **GPL-3.0 / LGPL-3.0** | **No** for linked code | — |
**Every "yes" above requires an entry in `NOTICE`.** That file is the project's **Every "yes" above requires an entry in `NOTICE`.** That file is the project's
attribution record and the thing that makes the permissive licences actually attribution record and the thing that makes the licences actually satisfied
satisfied rather than merely tolerated. rather than merely tolerated.
### Why GPL-2.0-only is a hard no ### One binary, one GPL version
Apache-2.0 imposes conditions GPLv2 treats as "further restrictions" under its "Or later" means SchOS code can go out under GPLv2 *or* GPLv3. A single linked
§6 — principally the patent-retaliation term. The FSF and the ASF agree on binary still has to pick one:
this: **Apache-2.0 code and GPL-2.0-only code cannot be combined into one
distributable work.** It is not a matter of taste or of how carefully the files
are kept apart in the tree; it is that the combined binary cannot satisfy both
licences at once.
GPL-3.0 fixed this in the other direction (Apache-2.0 is compatible *into* - Add **Linux code** (GPL-2.0-only) and that binary is GPLv2.
GPLv3), but that does not help: the result would have to ship under GPLv3, and - Add **Apache-2.0 or GPLv3 code** and that binary is GPLv3, because
SchOS does not. Apache-2.0's patent terms are "further restrictions" under GPLv2 §6.
**Practical consequence:** BSD drivers can be adopted. Linux drivers cannot, Those two cannot meet in one binary. Linux is the main reason for the GPL, so
ever, no matter how convenient. This is why the USB stack was written from the **the kernel stays GPLv2-compatible**: no Apache-2.0 or GPLv3 code is linked
specification rather than ported. into it. Userland programs are separate works, so one may be GPLv3 or
Apache-2.0 on its own without affecting anything else.
**"Cannot be adopted" is not the same as "cannot be run."** A driver the *user* Data files such as fonts are not linked code. Roboto (Apache-2.0) sits beside
obtains and loads on their own machine is their act, not a distribution by us — the system as an aggregate, and that holds inside the ramdisk too: the image is
see §4 and [architecture/ldls.md](architecture/ldls.md), which is the layer built on exactly a filesystem carried by the kernel binary, not code linked with it.
that distinction and which ships no Linux code of any kind.
--- ---
@ -80,7 +82,7 @@ uniformly licensed**, and the difference matters per file:
|---|---| |---|---|
| 2-clause BSD — modern NetBSD Foundation files | **Fine** | | 2-clause BSD — modern NetBSD Foundation files | **Fine** |
| 3-clause, "Regents of the University of California" | **Fine.** Berkeley formally rescinded the advertising clause in 1999 | | 3-clause, "Regents of the University of California" | **Fine.** Berkeley formally rescinded the advertising clause in 1999 |
| 4-clause with the advertising clause, **non-UC** copyright holder | **Avoid.** Berkeley's rescission covers Berkeley's copyright, not other people's | | 4-clause with the advertising clause, **non-UC** copyright holder | **No.** Berkeley's rescission covers Berkeley's copyright, not other people's, and the clause is GPL-incompatible |
The last row is real, not hypothetical. Measured on this checkout: The last row is real, not hypothetical. Measured on this checkout:
@ -91,10 +93,9 @@ lib/libc 101 of 1575
sys/net 5 of 180 ← the TCP/IP stack is nearly clean sys/net 5 of 180 ← the TCP/IP stack is nearly clean
``` ```
4-clause is still permissive and still redistributable; the burden is an 4-clause is still permissive on its own, but the advertising clause is a
advertising obligation that accumulates quietly and is tedious to honour further restriction the GPL does not allow, so **a 4-clause file cannot be
properly. Prefer a 2-clause or UC-Regents file. If a 4-clause file is genuinely combined with SchOS at all**. Use a 2-clause or UC-Regents file, or write it.
the right answer, it goes into `NOTICE` with the full clause quoted.
Check before copying, not after: Check before copying, not after:
@ -128,7 +129,7 @@ the top of the file; the UC block is a separate licence further down. Berkeley
never spoke for WIDE, so the rescission does not reach it. The two most never spoke for WIDE, so the rescission does not reach it. The two most
valuable files in the stack are the two encumbered ones. valuable files in the stack are the two encumbered ones.
That is not fatal — 4-clause is still permissive — but it is exactly the case Under the GPL that rules them out, and it is exactly the case
where a **second BSD tree earns its disk space**: FreeBSD's TCP has been where a **second BSD tree earns its disk space**: FreeBSD's TCP has been
through a relicensing effort NetBSD's has not, so the same file there may well through a relicensing effort NetBSD's has not, so the same file there may well
be 2-clause. Check it the same way before assuming either: be 2-clause. Check it the same way before assuming either:
@ -180,13 +181,13 @@ Chosen 2026-08-09, both licences checked at source rather than assumed:
| Roboto | desktop, window manager, compositor | **Apache-2.0** | | Roboto | desktop, window manager, compositor | **Apache-2.0** |
| JetBrains Mono | terminal, TTY | **SIL OFL 1.1** | | JetBrains Mono | terminal, TTY | **SIL OFL 1.1** |
Roboto is the same licence as SchOS, so it is the easy case: a NOTICE entry Roboto is Apache-2.0, which is fine for a font: it is a data file beside the
and nothing else. system, not code linked into it (§2). A NOTICE entry and nothing else.
OFL is permissive and bundling is precisely what it is for, with two conditions OFL is permissive and bundling is precisely what it is for, with two conditions
worth knowing before anyone subsets or converts a font: worth knowing before anyone subsets or converts a font:
- **The font stays under OFL** even inside an Apache-2.0 system. It does not - **The font stays under OFL** even inside a GPL-licensed system. It does not
infect anything else; it just cannot be relicensed. infect anything else; it just cannot be relicensed.
- **It may not be sold on its own.** Shipping it as part of an OS is fine. - **It may not be sold on its own.** Shipping it as part of an OS is fine.
- **Reserved Font Names.** JetBrains Mono declares *none* -- its copyright line - **Reserved Font Names.** JetBrains Mono declares *none* -- its copyright line
@ -212,42 +213,17 @@ with SchOS. Keeping the distinction sharp is what stops it eroding:
rebuild never needs the network; not part of any image, and not all of it is rebuild never needs the network; not part of any image, and not all of it is
redistributable. redistributable.
### The userland this rules out, and what was done instead ### The userland, and why it is permissive anyway
The rule costs something real and it is worth naming the bill rather than only While SchOS was Apache-2.0, **BusyBox** (GPL-2.0-only) and **nano** (GPL-3.0)
the principle. were ruled out, and the userland was built from toybox (0BSD), mksh and kilo
(BSD-2-Clause) instead. Both would be possible now — nano as a separate program
— but nothing needs replacing: toybox gives 268 applets, kilo is installed as
`/bin/edit`, and `cmd/httpd` is first-party.
**BusyBox** is the obvious userland for a system this size — about four hundred The `wget` failure that started that discussion was not a userland problem:
applets, including a shell, an editor, `less` and an `httpd`. It is SchOS had no DNS reachable from a process, which BusyBox would have hit
**GPL-2.0-only**, so §2 applies, and here the consequence is sharper than identically. See [architecture/networking.md](architecture/networking.md).
"cannot be linked": `make ramroot` links the root filesystem image *into the
kernel binary*, so a BusyBox in `sysroot/` would put GPLv2 code inside an
Apache-2.0 executable. Excluding it from the ramdisk avoids that and leaves the
ramroot build with no userland at all, which is not a trade worth making.
**nano** is the same answer for the same reason, one version later: GPL-3.0,
which is incompatible with Apache-2.0 in the other direction.
What was done instead, when the complaint "the userland is too thin" came up:
| wanted | answer |
|---|---|
| `awk`, `bc`, `diff`, `more`, `expr`, `tr`, … | already in toybox, in `toys/pending/`, switched off by `defconfig`. Turning 26 of them on took the shipped set from 236 applets to 268, at no licensing cost — it is the same 0BSD tarball. |
| an editor that is not `vi` | [kilo](https://github.com/antirez/kilo), BSD-2-Clause, one file, no dependencies. Installed as `/bin/edit` as well as `/bin/kilo`. |
| `wget` that works | not a userland problem at all. See below. |
| something to host with | `cmd/httpd`, written here, Apache-2.0. |
The `wget` one is worth recording because it was diagnosed wrongly at first,
and switching userland would not have fixed it: **SchOS had no DNS reachable
from a process**, so every program taking a hostname failed and each looked
like its own bug. BusyBox's `wget` would have failed identically. musl already
contains a complete resolver; the only missing fact was which nameserver, which
the kernel had all along from DHCP and never published. See
[architecture/networking.md](architecture/networking.md).
The general shape: **a permissive answer existed for every one of these**, and
three of the four were already in the tree. That will not always be true, and
when it is not the answer is still no.
The mechanisms that keep this from eroding, since good intentions have already The mechanisms that keep this from eroding, since good intentions have already
failed once here: failed once here:
@ -286,22 +262,26 @@ copied file is a file to be understood, attributed and maintained forever.
## 6. LDLS, and the distribution boundary ## 6. LDLS, and the distribution boundary
[architecture/ldls.md](architecture/ldls.md) runs Linux drivers. That sounds like it should [architecture/ldls.md](architecture/ldls.md) runs Linux drivers. This section
contradict §2, and it does not, because the two questions below are different was written when SchOS was Apache-2.0 and the boundary below was a legal
ones and only the first is about us. necessity. Under GPL-2.0-or-later it is a **project policy** instead: shipping
a GPL-2.0-only `.ko` with SchOS would now be lawful, provided the source goes
with it. It is still not done, because a module we never ship is a module we
never have to vouch for, track upstream, or provide source for.
### LDLS is Apache-2.0 ### LDLS is ours
Every file under `ldls/` is ours. The loader was written from the ELF-64 gABI Every file under `ldls/` is ours, GPL-2.0-or-later. The loader was written from
and the x86-64 psABI; the shim is written under the rule in the ELF-64 gABI and the x86-64 psABI; the shim is written under the rule in
[architecture/ldls.md](architecture/ldls.md). **No Linux code is in it and none ever will [architecture/ldls.md](architecture/ldls.md). Copying Linux code into it would
be**, which is the same standard the xHCI and USB stacks already meet (§5). no longer be a licence problem, but the shim's value is that it is small and
understood, so the existing rule stands.
### The combination is not ours to make ### The combination is the user's
| | licence | who distributes it | | | licence | who distributes it |
|---|---|---| |---|---|---|
| `ldls/` — loader, shim, host | **Apache-2.0** | us | | `ldls/` — loader, shim, host | **GPL-2.0-or-later** | us |
| a `.ko` | GPL-2.0-only, usually | the user's distribution | | a `.ko` | GPL-2.0-only, usually | the user's distribution |
| the two running together in a process | — | **nobody** | | the two running together in a process | — | **nobody** |
@ -311,20 +291,10 @@ GPLv2 §0 is explicit about where its obligations attach:
> by this License; they are outside its scope. **The act of running the Program > by this License; they are outside its scope. **The act of running the Program
> is not restricted.** > is not restricted.**
So: we ship Apache-2.0 code containing no GPL. The user obtains a GPL module So: we ship LDLS and no modules. The user obtains a module from wherever they
from wherever they get their software. The user runs them together on their own get their software and runs it on their own machine. `RAMDISK_EXCLUDE` and the
machine. No combined work is distributed by anyone, and no GPL obligation is `*.ko` rule in `.gitignore` keep that boundary mechanical rather than
triggered — not on us, and not on them. intentional.
This is the position FreeBSD has shipped from for about a decade: a
BSD-licensed `linuxkpi` in base, GPL `drm-kmod` installed by the user from
ports.
**The consequence for the user, stated plainly:** they cannot redistribute the
combination either. An image with a `.ko` baked into it is a single work that
would have to satisfy Apache-2.0 and GPL-2.0-only at once, which §2 explains is
impossible. That is why `RAMDISK_EXCLUDE` exists, and why `.gitignore` refuses
`*.ko` outright — the boundary is kept mechanically rather than by intention.
### `EXPORT_SYMBOL_GPL` does not apply ### `EXPORT_SYMBOL_GPL` does not apply
@ -335,7 +305,7 @@ that.
**LDLS has no Linux symbols to gate.** `EXPORT_SYMBOL_GPL` is Linux marking **LDLS has no Linux symbols to gate.** `EXPORT_SYMBOL_GPL` is Linux marking
*Linux's own* symbols, and the check it drives protects those. Every symbol *Linux's own* symbols, and the check it drives protects those. Every symbol
LDLS provides is ours — reimplemented from facts, under Apache-2.0. There is no LDLS provides is ours — reimplemented from facts, under GPL-2.0-or-later. There is no
gate being bypassed, because there is no Linux symbol being exposed. gate being bypassed, because there is no Linux symbol being exposed.
So LDLS implements no licence check. It **reads** the module's declared licence So LDLS implements no licence check. It **reads** the module's declared licence

View file

@ -135,10 +135,9 @@ in `NOTICE` **before** the file is committed, not after.
| libxkbcommon | MIT | | libxkbcommon | MIT |
| xkeyboard-config | MIT | | xkeyboard-config | MIT |
All Apache-2.0 compatible, all needing only a `NOTICE` entry. **Nothing here All GPL-2.0-or-later compatible, all needing only a `NOTICE` entry. The
carries the GPL problem that governs drivers**, which is a pleasant change and Wayland ecosystem is permissively licensed almost throughout, so nothing here
worth noticing: the Wayland ecosystem is permissively licensed almost throughout, raises a licensing question at all.
and that is a genuine argument for it beyond any technical one.
--- ---

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// Counters for the filesystem and block paths, read through /proc/fsstat. // Counters for the filesystem and block paths, read through /proc/fsstat.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// /dev/pci -- device access from userspace. // /dev/pci -- device access from userspace.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// SchOS — POSIX-compatibility types used by kernel syscall handlers. // SchOS — POSIX-compatibility types used by kernel syscall handlers.
#pragma once #pragma once
#include "types.h" #include "types.h"

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
#ifndef SCHBOOT_H #ifndef SCHBOOT_H
#define SCHBOOT_H #define SCHBOOT_H

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// The protocol between PID 1 and the supervisor. // The protocol between PID 1 and the supervisor.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// Virtual terminals. // Virtual terminals.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// Hardware watchpoints. docs/architecture/debugging.md milestone D4. // Hardware watchpoints. docs/architecture/debugging.md milestone D4.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// The kernel log that outlives the kernel. See include/klog.h. // The kernel log that outlives the kernel. See include/klog.h.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// Naming an address. // Naming an address.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// PSOGM — the SchOS crash screen. // PSOGM — the SchOS crash screen.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// The bounded string builder. See include/sbuf.h for what it is and why it // The bounded string builder. See include/sbuf.h for what it is and why it
// moved out of kernel/dev/procfs.c. // moved out of kernel/dev/procfs.c.

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// /dev/dbg -- asking the kernel a question. See include/dbg.h. // /dev/dbg -- asking the kernel a question. See include/dbg.h.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// /dev/netdev -- a network interface whose backend is a process. // /dev/netdev -- a network interface whose backend is a process.
// See include/netuser.h. // See include/netuser.h.

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// /dev/pci -- PCI devices, reachable from userspace. // /dev/pci -- PCI devices, reachable from userspace.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// Virtual terminals. See include/vt.h for why this exists at all; the short // Virtual terminals. See include/vt.h for why this exists at all; the short
// version is that switching needs a backing store, and the console drew // version is that switching needs a backing store, and the console drew

View file

@ -10,9 +10,9 @@
// the controller is not complicated; BSD is much more valuable as the // the controller is not complicated; BSD is much more valuable as the
// reference you check yourself against than as the code you paste. // reference you check yourself against than as the code you paste.
// //
// (Licensing points the same way. The BSD stacks are BSD-2/3-clause, which is // (Licensing no longer decides it: the BSD stacks are BSD-2/3-clause and
// compatible with Apache-2.0 -- Linux's drivers are GPL-2.0-only, which is // Linux's drivers are GPL-2.0-only, and both combine with GPL-2.0-or-later.
// not. See docs/guides/adding-a-driver.md.) // The argument above is the whole reason. See docs/licensing.md.)
// //
// Enumeration polls the event ring instead of using interrupts. That is not // Enumeration polls the event ring instead of using interrupts. That is not
// laziness: pci_bind_all() runs from kmain() with interrupts disabled and no // laziness: pci_bind_all() runs from kmain() with interrupts disabled and no

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// devtmpfs: /dev, generated rather than stored. // devtmpfs: /dev, generated rather than stored.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// Attributes, and the index over them. // Attributes, and the index over them.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// SchFS copy-on-write B-tree — see btree.h for the contract. // SchFS copy-on-write B-tree — see btree.h for the contract.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// SchFS in the kernel: block device, mount, and the transaction bracket. // SchFS in the kernel: block device, mount, and the transaction bracket.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// SchFS object layer, read side: inodes, directories and file data. // SchFS object layer, read side: inodes, directories and file data.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// SchFS object layer, write side: create, link, unlink, rename, write, // SchFS object layer, write side: create, link, unlink, rename, write,
// truncate. // truncate.

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// SchFS internals: the volume (uberblock ring, block allocation) and the object // SchFS internals: the volume (uberblock ring, block allocation) and the object
// layer (inodes, directories, file data) that sit on top of the B-tree. // layer (inodes, directories, file data) that sit on top of the B-tree.

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// SchFS space manager: which blocks are in use. // SchFS space manager: which blocks are in use.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// SchFS behind the VFS: the fs_ops table that makes SchFS files reachable // SchFS behind the VFS: the fs_ops table that makes SchFS files reachable
// through open(2), read(2), write(2) and the rest. // through open(2), read(2), write(2) and the rest.

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// SchFS volume layer: the uberblock ring. // SchFS volume layer: the uberblock ring.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// AF_INET sockets, on top of lwIP's raw API. // AF_INET sockets, on top of lwIP's raw API.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// lwIP's compiler/platform header for SchOS. // lwIP's compiler/platform header for SchOS.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// lwIP configuration for SchOS. // lwIP configuration for SchOS.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// lwIP network interfaces over the netdev class. // lwIP network interfaces over the netdev class.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// <ctype.h> for lwIP, shadowing the host's. // <ctype.h> for lwIP, shadowing the host's.
// //
// Empty on purpose. Everything lwIP would take from this header is supplied by // Empty on purpose. Everything lwIP would take from this header is supplied by

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// <errno.h> for lwIP, shadowing the host's. // <errno.h> for lwIP, shadowing the host's.
// //
// Empty on purpose. Everything lwIP would take from this header is supplied by // Empty on purpose. Everything lwIP would take from this header is supplied by

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// <inttypes.h> for lwIP, shadowing the host's. // <inttypes.h> for lwIP, shadowing the host's.
// //
// Empty on purpose. Everything lwIP would take from this header is supplied by // Empty on purpose. Everything lwIP would take from this header is supplied by

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// <limits.h> for lwIP, shadowing the host's. // <limits.h> for lwIP, shadowing the host's.
// //
// Empty on purpose. Everything lwIP would take from this header is supplied by // Empty on purpose. Everything lwIP would take from this header is supplied by

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// <stddef.h> for lwIP, shadowing the host's. // <stddef.h> for lwIP, shadowing the host's.
// //
// Empty on purpose. Everything lwIP would take from this header is supplied by // Empty on purpose. Everything lwIP would take from this header is supplied by

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// <stdint.h> for lwIP, shadowing the host's. // <stdint.h> for lwIP, shadowing the host's.
// //
// Empty on purpose. Everything lwIP would take from this header is supplied by // Empty on purpose. Everything lwIP would take from this header is supplied by

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// <stdio.h> for lwIP, shadowing the host's. // <stdio.h> for lwIP, shadowing the host's.
// //
// Empty on purpose. Everything lwIP would take from this header is supplied by // Empty on purpose. Everything lwIP would take from this header is supplied by

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// <stdlib.h> for lwIP, shadowing the host's. See shim/string.h for why these // <stdlib.h> for lwIP, shadowing the host's. See shim/string.h for why these
// files exist at all. // files exist at all.

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// <string.h> for lwIP, shadowing the host's. // <string.h> for lwIP, shadowing the host's.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// <unistd.h> for lwIP, shadowing the host's. // <unistd.h> for lwIP, shadowing the host's.
// //
// Empty on purpose. Everything lwIP would take from this header is supplied by // Empty on purpose. Everything lwIP would take from this header is supplied by

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// The lwIP port layer: everything lwIP needs from the system it runs on. // The lwIP port layer: everything lwIP needs from the system it runs on.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// The network thread, and the one place the TCP/IP stack is started. // The network thread, and the one place the TCP/IP stack is started.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// rtnetlink, enough of it that getifaddrs(3) works. // rtnetlink, enough of it that getifaddrs(3) works.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// Linux x86_64 syscall number -> SchOS syscall number translation. // Linux x86_64 syscall number -> SchOS syscall number translation.
// Enabled per process by sys_enable_linux_abi (see kernel/sys/sys_compat.c). // Enabled per process by sys_enable_linux_abi (see kernel/sys/sys_compat.c).
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// Reading BTF. See ldls/btf.h. // Reading BTF. See ldls/btf.h.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// Reading BTF: struct layouts and function prototypes, from the kernel that // Reading BTF: struct layouts and function prototypes, from the kernel that
// the driver was built for. // the driver was built for.

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// ldls-inspect -- what is in a relocatable object, and what it wants. // ldls-inspect -- what is in a relocatable object, and what it wants.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// ldls-run -- load a module and call its init, on the build machine. // ldls-run -- load a module and call its init, on the build machine.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// ldls-types -- ask a kernel's BTF where its fields are. // ldls-types -- ask a kernel's BTF where its fields are.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// Loading a relocatable object. See ldls/ko.h. // Loading a relocatable object. See ldls/ko.h.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
// Loading a relocatable object. docs/architecture/ldls.md, "The loader". // Loading a relocatable object. docs/architecture/ldls.md, "The loader".

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// Register access. See ldls/kpi/kpi.h for the provenance rule. // Register access. See ldls/kpi/kpi.h for the provenance rule.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// The KPI, and the table the loader resolves against. See ldls/kpi/kpi.h. // The KPI, and the table the loader resolves against. See ldls/kpi/kpi.h.
// //

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: GPL-2.0-or-later
// //
// The KPI: the Linux symbols a hosted driver actually calls, implemented. // The KPI: the Linux symbols a hosted driver actually calls, implemented.
// //

Some files were not shown because too many files have changed in this diff Show more