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.
- [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.
- [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.
- [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.

View file

@ -1,6 +1,6 @@
---
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:
node_type: memory
type: project
@ -8,43 +8,34 @@ metadata:
modified: 2026-08-08T16:18:39.569Z
---
**`LICENSE` is Apache-2.0**, copyright *Nexoniarz* (not "Schunix Contributors" —
one author, and a fictional collective makes future re-licensing harder).
Chosen over MIT/BSD for the express patent grant.
**`LICENSE` is GPL-2.0-or-later** since 2026-10-22, copyright *Nexoniarz*, sole
author. It was Apache-2.0 before and was never published under it. Nexoniarz
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
discussed at length in 2026-08 and **on 2026-08-08 Nexoniarz asked for it to be
dropped from the docs entirely** — `docs/licensing.md` is about licensing, not
about that debate. All references are gone from `docs/`, `LICENSE` and `NOTICE`;
don't reintroduce them. The substance that survives, in one line inside §1:
Apache-2.0 §2 is an irrevocable grant, so a restriction stated anywhere else
does not narrow it, and restricting distribution would be a licence change
(bespoke proprietary, or BUSL-1.1) rather than a wording change.
**The rule that replaced "Linux no":** a single linked binary has to pick one
GPL version. Linux code (GPL-2.0-only) makes it GPLv2; Apache-2.0 or GPLv3 code
makes it GPLv3. They can't share a binary, so **the kernel takes no Apache-2.0
or GPLv3 code**. Separate userland programs may be GPLv3 or Apache. Data files
such as Roboto (Apache-2.0) are aggregation, and that holds inside the ramdisk
too. BSD 4-clause code is now a hard **no** (GPL-incompatible).
The decision that actually mattered to them is **when to publish**, not the
licence; the standing rule is still never ([[nexoniarz-sharing-preference]]).
**LDLS still ships no `.ko`.** That is policy now, not a legal requirement. The
`.gitignore` `*.ko` rule and `RAMDISK_EXCLUDE` stay.
**Binding regardless of what they pick:**
- The kernel derives from xv6 (MIT). `LICENSE.MIT` was *missing* — it was
referenced as `bk/LICENSE.MIT` and lost in the `bk/` → `kernel/` migration.
Recreated; must not be deleted.
- `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.
**Settled, do not reopen:** the old "Apache-2.0 but shared-source" debate was
dropped from the docs on 2026-08-08. The question that matters to them is when
to publish, and the standing answer is still never
([[nexoniarz-sharing-preference]]).
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
it from like Linux?"). Linux is GPL-2.0-**only**, and Apache-2.0's patent and
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]].
New first-party files carry `// SPDX-License-Identifier: GPL-2.0-or-later`.
The policy is in `docs/licensing.md`. See [[schunix-roadmap-and-projects]].
## 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
# 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
# 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.xz
@ -59,7 +60,7 @@ core.*
#
# 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
# 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
# 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

460
LICENSE
View file

@ -1,187 +1,339 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
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,
and distribution as defined by Sections 1 through 9 of this document.
The licenses for most software are designed to take away your
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
the copyright owner that is granting the License.
When we speak of free software, we are referring to freedom, not
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
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
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.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
For example, if you distribute copies of such a program, whether
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,
including but not limited to software source code, documentation
source, and configuration files.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
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
the License, as indicated by a copyright notice that is included in
or attached to the work (an example is provided in the Appendix below).
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
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
form, that is based on (or derived from) the Work and for which the
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.
The precise terms and conditions for copying, distribution and
modification follow.
"Contribution" shall mean, as submitted to the Licensor for inclusion
in the Work by the copyright owner or by an individual or Legal Entity
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.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
"Contributor" shall mean Licensor and any Legal Entity on behalf of
whom a Contribution has been received by the Licensor and included
within the Work.
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
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
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
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.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
2. You may modify your copy or copies of the Program or any portion
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
stating that You changed the files; and
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
(d) If the Work includes a "NOTICE" text file as part of its
distribution, You must include a readable copy of the
attribution notices contained within such NOTICE file, in
at least one of the following places: within a NOTICE text
file distributed as part of the Derivative Works; within
the Source form or documentation, if provided along with the
Derivative Works; or, within a display generated by the
Derivative Works, if and wherever such third-party notices
normally appear. The contents of the NOTICE file are for
informational purposes only and do not modify the License.
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.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
You may add Your own license statement for Your modifications and
may provide additional grant of rights to use, copy, modify, and
distribute those modifications as a separate work, subject to the
terms and conditions of this License.
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
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,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
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.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
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.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
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).
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may offer such
obligations only on Your behalf and on Your sole responsibility,
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.
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
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.)
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.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
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.
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.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
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.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
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
Copyright 2026 Nexoniarz
How to Apply These Terms to Your New Programs
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
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.
http://www.apache.org/licenses/LICENSE-2.0
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.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
NOTE: The kernel (kernel/) is derived from xv6 (MIT License, Copyright
2006-2019 Frans Kaashoek, Robert Morris, Russ Cox, M.I.T. CSAIL).
The MIT license notice is preserved in LICENSE.MIT and must not be
removed. Third-party software redistributed in a built image -- musl,
toybox and mksh, all under ports/ -- keeps its own license; see NOTICE.
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.
Which outside code may be copied into SchOS and which may not -- the
BSD/GPL rules, the NetBSD advertising clause, and what is deliberately
never shipped -- is written up in docs/licensing.md. Read it before
copying anyone else's code in.
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
# 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
# cannot be combined with Apache-2.0, or that simply is not ours to redistribute,
# belongs on this list rather than in someone's memory.
# cannot be combined with GPL-2.0-or-later, or that simply is not ours to
# 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
# 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
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
@ -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,
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
(kernel/net/lwip/) is Apache-2.0 and is not part of lwIP; lwIP's own 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.
(kernel/net/lwip/) is GPL-2.0-or-later and is not part of lwIP; lwIP's own
sources are unmodified. Clause 3 is a no-endorsement term, not the four-clause
advertising requirement, so it combines with the GPL without difficulty.
--------------------------------------------------------------------------------
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
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
Apache-2.0 and GPL-2.0-only cannot be combined (see docs/licensing.md section
2).
the BSD option, which was chosen while SchOS was Apache-2.0; either option is
compatible now, and the BSD one is kept because it asks less of anyone.
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
@ -163,9 +163,10 @@ Roboto Apache-2.0
Copyright the Roboto Project Authors (https://github.com/googlefonts/roboto)
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
obligation beyond this notice. Intended for the desktop, window manager and
compositor.
under Apache-2.0. It is a separate data file loaded at run time, not code
linked into SchOS, so it sits beside the GPL as an aggregate and keeps its own
licence; the obligation is this notice. Intended for the desktop, window
manager and compositor.
--------------------------------------------------------------------------------
JetBrains Mono SIL OFL 1.1
@ -178,7 +179,7 @@ Shipped as /usr/share/fonts/JetBrainsMono-Regular.ttf, from ports/JetBrains_Mono
and TTY.
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
permitted. JetBrains Mono declares no Reserved Font Name, so a modified version
(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
**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).
Third-party code redistributed in a built image (musl, toybox, mksh, zsh, kilo,
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
the userland is toybox and not BusyBox and the editor is kilo and not nano. See
[docs/licensing.md](docs/licensing.md).
See [docs/licensing.md](docs/licensing.md).
Drivers may be adapted from BSD sources, which are compatible. Linux drivers are
not: GPL-2.0-only and Apache-2.0 cannot be combined and redistributed. Reading
Linux to understand hardware is fine; translating a driver is not. Best of all
is the public specification — xHCI, virtio, AHCI, e1000 — which carries no
licence on what you write from it.
Drivers may be adapted from BSD sources and, since the move to the GPL, from
Linux — GPL-2.0-only code combines with GPL-2.0-or-later, and the result ships
under GPLv2. Best of all is still the public specification — xHCI, virtio,
AHCI, e1000 — which carries no 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
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.
*

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.
*

View file

@ -1,4 +1,4 @@
<!-- SPDX-License-Identifier: Apache-2.0 -->
<!-- SPDX-License-Identifier: GPL-2.0-or-later -->
# UEFI loader
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
#ifndef 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.
//

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.
//

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.
//

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: GPL-2.0-or-later
//
// 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.
//

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.
//

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.
//

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.
//

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.
//

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.
//

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.
//

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.
//

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: GPL-2.0-or-later
//
// 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.
//

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.
//

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.
//

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.
//

View file

@ -1,4 +1,4 @@
<!-- SPDX-License-Identifier: Apache-2.0 -->
<!-- SPDX-License-Identifier: GPL-2.0-or-later -->
# The website
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
--------------------------------------------------------------------------

View file

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

View file

@ -77,7 +77,7 @@
<div class="nv-divider"></div>
<div class="site-footer__row">
<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>
<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.
*

View file

@ -283,7 +283,7 @@
<div class="nv-divider"></div>
<div class="site-footer__row">
<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>
<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>
</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 class="nv-card nv-card--flush console" aria-label="Boot log">
@ -642,7 +642,7 @@
<div class="nv-divider"></div>
<div class="site-footer__row">
<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>
<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
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
easy to get wrong in both directions:
- **Distribution is what triggers the GPL.** Shipping a GPL-2.0-only driver in
an Apache-2.0 image is what cannot be done — see [../licensing.md](../licensing.md)
§2. A user obtaining a driver themselves and loading it on their own machine
is their act, not ours, and is not a distribution by us.
- **Distribution is what triggers the GPL.** SchOS is GPL-2.0-or-later, so
shipping a GPL-2.0-only driver in an image is now *possible* — see
[../licensing.md](../licensing.md) §6 — but LDLS still does not, by policy. A
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
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
@ -259,8 +260,8 @@ easy to get wrong in both directions:
identifiers say.
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
GPL ever enters an image we build. `RAMDISK_EXCLUDE` and `NOTPORTS` are the
loader is ours and GPL-2.0-or-later, what it loads is the user's business, and
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.
---

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.
[../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
containing no GPL, and the combination happens in a user process on the user's
machine — so no combined work is distributed by anyone.
that the combination happens in a user process on the user's machine, so no
combined work is distributed by anyone. Since SchOS moved to GPL-2.0-or-later
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

View file

@ -1,4 +1,4 @@
<!-- SPDX-License-Identifier: Apache-2.0 -->
<!-- SPDX-License-Identifier: GPL-2.0-or-later -->
# Virtual terminals
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
the theme accent, from the same bytes.
- **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`.
- 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.

View file

@ -1,4 +1,4 @@
<!-- SPDX-License-Identifier: Apache-2.0 -->
<!-- SPDX-License-Identifier: GPL-2.0-or-later -->
# Building SchOS
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
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
cannot be combined with Apache-2.0 does not merely ride along — it makes the
kernel itself undistributable. `RAMDISK_EXCLUDE` in the Makefile is the list of
is not ours to redistribute does not merely ride along — it makes the kernel
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
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

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
**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
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.
**Why the GPL.** Two reasons, one about others and one about us:
What that grant means in practice: Apache-2.0 §2 gives everyone a perpetual,
worldwide, irrevocable licence to reproduce, modify, sublicense and distribute
SchOS. Any additional restriction stated elsewhere — in a README, a website,
or a policy — does not narrow it. The licence text is what holds up.
- **Copyleft.** Anyone may use, study, modify and redistribute SchOS — but
whoever ships it, or something built from it, must ship the source of that
too, under the same terms. Under Apache-2.0 a fork could be closed and sold
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
(a bespoke proprietary licence, or something like BUSL-1.1 with a conversion
date), not a wording change, and it means giving up the Apache grant.
**Why "or later".** It keeps one door open that "only" would close: GPLv3 and
Apache-2.0 code can still be combined with SchOS code, with that combination
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 |
| BSD 2-clause | **Yes** | Keep the notice |
| BSD 3-clause | **Yes** | Keep the notice; no endorsement claims |
| BSD **4-clause** (advertising) | **Avoid** — see §3 | Notice *and* an acknowledgement in advertising materials |
| Apache-2.0 | **Yes** | Keep NOTICE contents |
| MPL-2.0 | Case by case | File-level copyleft; keep those files separate |
| **GPL-2.0-only** | **No** | — |
| **GPL-3.0 / LGPL-3.0** | **No** for linked code | — |
| BSD **4-clause** (advertising) | **No** — see §3 | GPL-incompatible |
| 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 | Compatible through its secondary-licence clause, unless marked otherwise |
| Apache-2.0, GPL-3.0, LGPL-3.0 | **Not in the kernel**; separate programs and files fine | See below |
**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
satisfied rather than merely tolerated.
attribution record and the thing that makes the licences actually satisfied
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
§6 — principally the patent-retaliation term. The FSF and the ASF agree on
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.
"Or later" means SchOS code can go out under GPLv2 *or* GPLv3. A single linked
binary still has to pick one:
GPL-3.0 fixed this in the other direction (Apache-2.0 is compatible *into*
GPLv3), but that does not help: the result would have to ship under GPLv3, and
SchOS does not.
- Add **Linux code** (GPL-2.0-only) and that binary is GPLv2.
- Add **Apache-2.0 or GPLv3 code** and that binary is GPLv3, because
Apache-2.0's patent terms are "further restrictions" under GPLv2 §6.
**Practical consequence:** BSD drivers can be adopted. Linux drivers cannot,
ever, no matter how convenient. This is why the USB stack was written from the
specification rather than ported.
Those two cannot meet in one binary. Linux is the main reason for the GPL, so
**the kernel stays GPLv2-compatible**: no Apache-2.0 or GPLv3 code is linked
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*
obtains and loads on their own machine is their act, not a distribution by us —
see §4 and [architecture/ldls.md](architecture/ldls.md), which is the layer built on exactly
that distinction and which ships no Linux code of any kind.
Data files such as fonts are not linked code. Roboto (Apache-2.0) sits beside
the system as an aggregate, and that holds inside the ramdisk too: the image is
a filesystem carried by the kernel binary, not code linked with it.
---
@ -80,7 +82,7 @@ uniformly licensed**, and the difference matters per file:
|---|---|
| 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 |
| 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:
@ -91,10 +93,9 @@ lib/libc 101 of 1575
sys/net 5 of 180 ← the TCP/IP stack is nearly clean
```
4-clause is still permissive and still redistributable; the burden is an
advertising obligation that accumulates quietly and is tedious to honour
properly. Prefer a 2-clause or UC-Regents file. If a 4-clause file is genuinely
the right answer, it goes into `NOTICE` with the full clause quoted.
4-clause is still permissive on its own, but the advertising clause is a
further restriction the GPL does not allow, so **a 4-clause file cannot be
combined with SchOS at all**. Use a 2-clause or UC-Regents file, or write it.
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
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
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:
@ -180,13 +181,13 @@ Chosen 2026-08-09, both licences checked at source rather than assumed:
| Roboto | desktop, window manager, compositor | **Apache-2.0** |
| JetBrains Mono | terminal, TTY | **SIL OFL 1.1** |
Roboto is the same licence as SchOS, so it is the easy case: a NOTICE entry
and nothing else.
Roboto is Apache-2.0, which is fine for a font: it is a data file beside the
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
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.
- **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
@ -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
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
the principle.
While SchOS was Apache-2.0, **BusyBox** (GPL-2.0-only) and **nano** (GPL-3.0)
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
applets, including a shell, an editor, `less` and an `httpd`. It is
**GPL-2.0-only**, so §2 applies, and here the consequence is sharper than
"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 `wget` failure that started that discussion was not a userland problem:
SchOS had no DNS reachable from a process, which BusyBox would have hit
identically. See [architecture/networking.md](architecture/networking.md).
The mechanisms that keep this from eroding, since good intentions have already
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
[architecture/ldls.md](architecture/ldls.md) runs Linux drivers. That sounds like it should
contradict §2, and it does not, because the two questions below are different
ones and only the first is about us.
[architecture/ldls.md](architecture/ldls.md) runs Linux drivers. This section
was written when SchOS was Apache-2.0 and the boundary below was a legal
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
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
be**, which is the same standard the xHCI and USB stacks already meet (§5).
Every file under `ldls/` is ours, GPL-2.0-or-later. The loader was written from
the ELF-64 gABI and the x86-64 psABI; the shim is written under the rule in
[architecture/ldls.md](architecture/ldls.md). Copying Linux code into it would
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 |
|---|---|---|
| `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 |
| 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
> is not restricted.**
So: we ship Apache-2.0 code containing no GPL. The user obtains a GPL module
from wherever they get their software. The user runs them together on their own
machine. No combined work is distributed by anyone, and no GPL obligation is
triggered — not on us, and not on them.
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.
So: we ship LDLS and no modules. The user obtains a module from wherever they
get their software and runs it on their own machine. `RAMDISK_EXCLUDE` and the
`*.ko` rule in `.gitignore` keep that boundary mechanical rather than
intentional.
### `EXPORT_SYMBOL_GPL` does not apply
@ -335,7 +305,7 @@ that.
**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
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.
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 |
| xkeyboard-config | MIT |
All Apache-2.0 compatible, all needing only a `NOTICE` entry. **Nothing here
carries the GPL problem that governs drivers**, which is a pleasant change and
worth noticing: the Wayland ecosystem is permissively licensed almost throughout,
and that is a genuine argument for it beyond any technical one.
All GPL-2.0-or-later compatible, all needing only a `NOTICE` entry. The
Wayland ecosystem is permissively licensed almost throughout, so nothing here
raises a licensing question at all.
---

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.
//

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.
//

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.
#pragma once
#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
#ifndef 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.
//

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: GPL-2.0-or-later
//
// 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.
//

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.
//

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: GPL-2.0-or-later
//
// 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.
//

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
// 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.
//

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.
// 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.
//

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
// 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
// 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
// compatible with Apache-2.0 -- Linux's drivers are GPL-2.0-only, which is
// not. See docs/guides/adding-a-driver.md.)
// (Licensing no longer decides it: the BSD stacks are BSD-2/3-clause and
// Linux's drivers are GPL-2.0-only, and both combine with GPL-2.0-or-later.
// The argument above is the whole reason. See docs/licensing.md.)
//
// Enumeration polls the event ring instead of using interrupts. That is not
// 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.
//

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.
//

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.
//

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.
//

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.
//

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,
// 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
// 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.
//

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
// 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.
//

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.
//

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.
//

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: GPL-2.0-or-later
//
// 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.
//

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.
//
// 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.
//
// 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.
//
// 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.
//
// 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.
//
// 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.
//
// 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.
//
// 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
// 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.
//

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.
//
// 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.
//

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.
//

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.
//

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.
// 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.
//

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
// 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.
//

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.
//

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.
//

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.
//

View file

@ -1,4 +1,4 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
// 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.
//

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.
//

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.
//

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