Skip to content

Ship the required third-party notices; remove mufplib from the boot ROM#57

Merged
begeistert merged 5 commits into
masterfrom
chore/notice-attribution
Jul 17, 2026
Merged

Ship the required third-party notices; remove mufplib from the boot ROM#57
begeistert merged 5 commits into
masterfrom
chore/notice-attribution

Conversation

@begeistert

Copy link
Copy Markdown
Collaborator

Every version of RP2040Sharp on nuget.org today has two problems that are invisible from this repo, because the repo was right and the package was not — and nobody opens a .nupkg.

The notices never shipped. The MIT licence requires its copyright and permission notice to travel with every copy. Ours only ever packaged LICENSE-BUSL.txt, which never mentions Uri Shaked; the LICENSE that carries the rp2040js attribution was left out of the package entirely. NOTICE.txt is new and is now packed into all four packages.

We were redistributing code we have no right to. pico-bootrom is BSD-3-Clause, but its LICENSE.TXT excludes mufplib.S and mufplib-double.S, which are licensed only for use "solely on a Raspberry Pi RP2040 device", or under GPLv2 from Mark Owen. An emulator is neither, and GPLv2 cannot ship inside a BUSL package. That was 35% of both ROM images.

  • tools/strip_mufplib.py blanks the float library out, resolving the region from the ROM's own FS/DE markers rather than hardcoded offsets, and refusing to run if any non-float ROM function points inside it. Image size is unchanged, so every ROM address stays valid.
  • BootromFloat implements the SF/SD ROM float API natively behind the tables firmware resolves, so firmware keeps working unmodified. The API comes from the RP2040 datasheet and pico-sdk's BSD-3-Clause headers; mufplib itself was never consulted.

This is load-bearing, not theoretical: pico-sdk builds float against the ROM by default, and with the hooks disabled every MicroPython float test fails.

Three details, all caught by the tests:

  • The ROM's fsin returns the sine in r0 and the cosine in r1; pico-sdk's sincosf depends on it.
  • float2int and friends round towards -Infinity, not towards zero.
  • Bootrom v2 (B1) never implemented the sincos slot — it points at unrelated ROM — so hooking is scoped to the stripped region to avoid hijacking real bootrom code.

Attribution corrections. Uri Shaked's copyright said 2026 (upstream says 2021). Iván's and Sergio's copyrights sat inside the MIT permission block, implying that code was MIT and contradicting the BUSL; the block now reproduces only the upstream notices. Sergio's notice is retained because his contributions came in under MIT while the project was MIT — the same grant that lets his work be relicensed is conditional on keeping his name.

A gate so this cannot recur. verify_packages.py reads each artifact between Pack and push and requires a licence file (never an SPDX expression — an expression packs nothing and carries no copyright line) plus NOTICE.txt. Verified against what is already published: it rejects every version on nuget.org today, including the current 1.0.1.

Tests: 533 unit (12 new), 157 integration (6 new). All four packages verified.

begeistert and others added 5 commits July 16, 2026 18:04
… from the bootrom

The MIT License requires its copyright and permission notice to travel with every
copy of the software. Ours did not: the published packages only ever contained
LICENSE-BUSL.txt, which never mentions Uri Shaked, and the LICENSE that does carry
the rp2040js attribution was left out of the .nupkg entirely. Add NOTICE.txt and
pack it into all four packages.

While auditing what else the packages redistribute, the bootrom turned out to be a
harder problem than a missing notice. pico-bootrom is BSD-3-Clause, but its
LICENSE.TXT excludes mufplib.S and mufplib-double.S, which are licensed only for use
"solely on a Raspberry Pi RP2040 device" (or GPLv2 from Mark Owen, their author).
An emulator is neither, and GPLv2 cannot ship inside a BUSL package — so we had no
permission for 35% of the ROM images we were embedding in the assembly. No amount of
attribution fixes that, so the code is gone:

- tools/strip_mufplib.py blanks the float library out of both images, resolving the
  region from the ROM's own FS/DE markers rather than hardcoded offsets, and refuses
  to run if any non-float ROM function points inside it. Image size is unchanged, so
  every ROM address stays valid.
- BootromFloat implements the 'SF'/'SD' ROM float API natively behind the tables the
  firmware resolves, so firmware keeps working unmodified. The API is taken from the
  RP2040 datasheet and pico-sdk's BSD-3-Clause headers; mufplib was never consulted.

This is load-bearing, not theoretical: pico-sdk builds float against the ROM by
default, and with the hooks disabled every MicroPython float test fails.

Two details worth recording, both caught by the tests:
- The ROM's fsin returns the sine in r0 *and* the cosine in r1; pico-sdk's sincosf
  depends on it.
- float2int and friends round towards -Infinity, not towards zero.
- Bootrom v2 (B1) never implemented the sincos slot: it points at unrelated ROM, so
  hooking is scoped to the stripped region to avoid hijacking real bootrom code.

Also correct the attribution itself: Uri Shaked's copyright said 2026 (upstream says
2021), and Iván's and Sergio's copyrights sat *inside* the MIT permission block,
implying that code was MIT and contradicting the BUSL. The MIT block now reproduces
only the upstream notice. README badge and License section said MIT; the project has
been BUSL-1.1 in its entirety since July.

Tests: 533 unit (12 new), 157 integration (6 new) green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ilicon

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The previous commit pulled every copyright but Uri Shaked's out of the retained
MIT block, on the grounds that the licensor's own copyright has no business
inside an MIT permission grant. That was right for Iván and wrong for Sergio.

Sergio contributed to the emulator core between December 2025 and February 2026,
while RP2040Sharp was MIT-licensed and he was already named a copyright holder in
LICENSE. There is no CLA and no assignment, so his copyright is still his. What
lets his work be relicensed under BUSL is the same thing that lets Uri's be: the
MIT grant of the right to sublicense. That grant is conditional on retaining the
notice — so it has to travel with every copy, exactly like Uri's.

Restate the MIT block as retained attribution for both, and say plainly which
portions each covers.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tices

Every version of RP2040Sharp on nuget.org today ships mufplib, which we have no
right to redistribute, and none of them carry the notices the MIT and BSD
components require. Both failures were invisible from the repo: the LICENSE was
correct, the package was not, and nobody opens a .nupkg.

Two gates between Pack and push:
  * strip_mufplib.py --check, so a boot ROM with the float library in it can
    never be packed again;
  * verify_packages.py, which reads each artifact and requires a licence *file*
    (never an SPDX expression — an expression packs nothing and carries no
    copyright line) plus NOTICE.txt.

Verified against the packages already published: it rejects all of them,
including the current 1.0.1, and accepts the fixed build.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add NuGet version/downloads badges (package is now published) and make the
  build badge clickable.
- Split "Getting Started" into NuGet Installation and Building from source, leading
  with `dotnet add package`.
- Remove the iCircuit roadmap item; generic circuit-simulator support stays.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@begeistert
begeistert requested a review from lmSeryi as a code owner July 17, 2026 08:13
@begeistert
begeistert merged commit 599b489 into master Jul 17, 2026
4 checks passed
@begeistert
begeistert deleted the chore/notice-attribution branch July 17, 2026 08:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant