<feed xmlns='http://www.w3.org/2005/Atom'>
<title>eglantine-cirakg/src/core/file_sys, branch nx2</title>
<subtitle>Mirror of github.com/cira0100/Eglantine-public nx2, a fork of Djihads80/Eglantine.</subtitle>
<id>https://git.cirakg.xyz/eglantine-cirakg/atom?h=nx2</id>
<link rel='self' href='https://git.cirakg.xyz/eglantine-cirakg/atom?h=nx2'/>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/'/>
<updated>2026-11-03T00:12:54+00:00</updated>
<entry>
<title>nup_writer: keep the dump's own layout for non-exefs/romfs entries</title>
<updated>2026-11-03T00:12:54+00:00</updated>
<author>
<name>a55uka</name>
<email>59313695+a55uka@users.noreply.github.com</email>
</author>
<published>2026-11-03T00:12:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=ebec180bf1125b4f29b068922d1220c8af9b63b0'/>
<id>urn:sha1:ebec180bf1125b4f29b068922d1220c8af9b63b0</id>
<content type='text'>
</content>
</entry>
<entry>
<title>file_sys: reject NUP tables with wrapping bounds or cyclic directories</title>
<updated>2026-11-02T19:53:47+00:00</updated>
<author>
<name>Sssnowyyy</name>
<email>78863999+Sssnowyyy@users.noreply.github.com</email>
</author>
<published>2026-11-02T16:25:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=089105ab44c87f1ef0526221144a1979c56558e6'/>
<id>urn:sha1:089105ab44c87f1ef0526221144a1979c56558e6</id>
<content type='text'>
31b901b93b checked the TOC with unchecked arithmetic on counts and
offsets read from the file. The record-table size (u64 count times
record size) and u32 first_child + child_count can wrap, so the bounds
checks pass and later reads go out of bounds; the same holds for the
TOC range, name ranges, file extents and the meta range. A directory
that lists its own ancestor as a child also made BuildDirTree recurse
until the stack overflowed.

Bound the counts by the TOC size before multiplying, compare ranges by
subtraction, and widen the child range to u64. Walk the directory graph
once after parsing with an explicit stack and reject cycles and nesting
deeper than 128, so BuildDirTree can no longer recurse without bound.
The file is rejected with ErrorNUPBadFormat.

Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
</content>
</entry>
<entry>
<title>file_sys: decompress large NUP zstd members once</title>
<updated>2026-11-02T19:53:47+00:00</updated>
<author>
<name>Sssnowyyy</name>
<email>78863999+Sssnowyyy@users.noreply.github.com</email>
</author>
<published>2026-11-02T16:23:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=8748fbd542a00ab7bbfbf17210b29f8d51c3c4b5'/>
<id>urn:sha1:8748fbd542a00ab7bbfbf17210b29f8d51c3c4b5</id>
<content type='text'>
31b901b93b only cached a zstd member while it fit the 512 MiB cache.
Anything larger was never cached, so every Read() allocated the full
uncompressed size and decompressed the whole extent again, which makes a
multi-GB RomFS read in small chunks unusably slow. Members between 256
and 512 MiB evicted each other on alternate reads, and Insert copied the
vector so memory briefly doubled. Two threads decompressing the same
member also left a duplicate LRU entry and a wrong byte count.

The writer emits one zstd frame per member, so there are no frame
boundaries to seek by. Members larger than half the cache are now
streamed once into a temporary file under the cache directory and read
from there, using bounded memory. The file is removed when the
container is released. Smaller members stay in the LRU, which now moves
the vector in and ignores a duplicate insert.

Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
</content>
</entry>
<entry>
<title>file_sys: let the NUP packer override and probe the name, icon and version</title>
<updated>2026-11-02T16:23:47+00:00</updated>
<author>
<name>kraibse</name>
<email>33869366+kraibse@users.noreply.github.com</email>
</author>
<published>2026-11-02T16:23:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=4267169006fc4ed43f6d810e08426fb8058de9c0'/>
<id>urn:sha1:4267169006fc4ed43f6d810e08426fb8058de9c0</id>
<content type='text'>
PackOptions::metadata overrides the title name, icon and display version
found in the dump. A version override is written to the base and to the
newest update, since the NUP loader reads the version from the newest
update first. ProbeMetadata reads what a dump would be packed with, the
version coming from the newest update that reports one, else the base.

Assisted-by: Claude Sonnet 5.5 (wrote the metadata overrides, ProbeMetadata and their test)
</content>
</entry>
<entry>
<title>Merge nx2 into nx2-experimental</title>
<updated>2026-11-02T13:43:01+00:00</updated>
<author>
<name>kraibse</name>
<email>33869366+kraibse@users.noreply.github.com</email>
</author>
<published>2026-11-02T12:50:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=c0cb3325e22756edb65c87d33ef298349ade0ad3'/>
<id>urn:sha1:c0cb3325e22756edb65c87d33ef298349ade0ad3</id>
<content type='text'>
Resolved by area:
- audio feature_support.h: nx2's native revision handling.
- fiber.cpp: ours, which also drops the unused rewind stack.
- host_memory.cpp: ours granule bitmap and HintCold, plus nx2's
  fallocate hole punching per whole dirty granule on Linux.
- texture_cache.h: nx2's old-age eviction pass, then our Collect().
- kepler_compute.cpp: shared upscale slots, then Fortune's Weave's,
  then the Kirby Air Riders scan.
- nx2_gsv.h: ours, plus nx2's GetBufferMaxResolution and graphics
  device ids (1-based).
- nvhost_ctrl_gpu.cpp: engine support flag bits 40-44.
- lower_to_maxwell.h: ours as the base, with nx2's seven lowering
  commits applied one at a time. Second texture descriptor buffers
  are read bindless in TEX, TLD.SCR (level zero) and SUST; FSEL
  keeps its operand modifiers; TXD takes any channel mask.

lower_to_maxwell.h lowers 837 Fortune's Weave and 1183 Mario Kart
World shader dumps with the same rejects as nx2 and ours (12 and 0).

Assisted-by: Claude Sonnet 5.5 (conflict analysis and drafting)
</content>
</entry>
<entry>
<title>file_sys: add a deterministic NUP packer, Convert to NUP in Qt and eden-cli --pack-nup (#271)</title>
<updated>2026-11-02T07:39:49+00:00</updated>
<author>
<name>Jonas</name>
<email>104419015+jojo-chaechae@users.noreply.github.com</email>
</author>
<published>2026-11-02T07:39:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=926e7ac6af102956b08cc053d81527ec3be855a2'/>
<id>urn:sha1:926e7ac6af102956b08cc053d81527ec3be855a2</id>
<content type='text'>
* file_sys: add a NUP packer for loose dumps

Packs a loose dump (exefs/romfs, base/, updates/&lt;version&gt;/ and
dlc/&lt;titleid&gt;/&lt;n&gt;/) into a NUP v1 container with the aligned record
layout. Every package is kept, files are deduplicated by SHA-256 and
compressed with zstd unless that does not shrink them, and files over
256 MiB are stored raw.

Output is byte-identical on every platform: compression is
single-threaded with every frame parameter set explicitly, and zstd is
always bundled so all builds use the same version.

A low-storage mode deletes each source file once its extent is synced
and journaled, and an interrupted run resumes from the journal.

Assisted-by: Claude Opus 5.5 (wrote the packer, its EdenPack-free dump detection, the aligned record layout and the deterministic zstd setup; ran the Raiders and Donkey Kong Bananza packs and boot checks)

* tests: cover the NUP packer

Round-trips a dump through NupContainer, checks standalone updates, a
bare exefs/romfs dump, low-storage resume and overwrite rejection, and
pins the hash of a packed dump so changes to the output are deliberate.

Assisted-by: Claude Opus 5.5 (wrote the tests, including the pinned output hash)

* qt: add Convert to NUP to the game list

Shown for loose dumps. Asks for confirmation with the estimated space,
offers low-storage mode, runs in the background with progress and
cancel, and resumes an interrupted low-storage conversion.

Assisted-by: Claude Opus 5.5 (wrote the Convert to NUP action and its progress and resume handling)

* cli: add --pack-nup &lt;dump&gt; [out.nup]

Assisted-by: Claude Opus 5.5 (wrote the --pack-nup option)</content>
</entry>
<entry>
<title>nup_container: update record layouts to aligned NUP v1 fields</title>
<updated>2026-11-02T02:38:53+00:00</updated>
<author>
<name>a55uka</name>
<email>59313695+a55uka@users.noreply.github.com</email>
</author>
<published>2026-11-02T01:41:05+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=b8d2c08d6efd312620b066cdab2f0238ebc94a26'/>
<id>urn:sha1:b8d2c08d6efd312620b066cdab2f0238ebc94a26</id>
<content type='text'>
</content>
</entry>
<entry>
<title>nup_container: update record layouts to aligned NUP v1 fields</title>
<updated>2026-11-02T01:41:05+00:00</updated>
<author>
<name>a55uka</name>
<email>59313695+a55uka@users.noreply.github.com</email>
</author>
<published>2026-11-02T01:41:05+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=10268f8c4ba3cc94142613a601b9b71a37ca7402'/>
<id>urn:sha1:10268f8c4ba3cc94142613a601b9b71a37ca7402</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Merge pull request #258 from Djihads80/nx2</title>
<updated>2026-11-01T23:05:04+00:00</updated>
<author>
<name>Assuka</name>
<email>59313695+a55uka@users.noreply.github.com</email>
</author>
<published>2026-11-01T23:05:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=8eaea9d3769fecff3dd7202884f66423ed2c83b1'/>
<id>urn:sha1:8eaea9d3769fecff3dd7202884f66423ed2c83b1</id>
<content type='text'>
bring nx2-experimental up to date </content>
</entry>
<entry>
<title>loader: add NUP (Unencrypted (Archival) Package) container support</title>
<updated>2026-11-01T18:53:47+00:00</updated>
<author>
<name>a55uka</name>
<email>59313695+a55uka@users.noreply.github.com</email>
</author>
<published>2026-11-01T18:53:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=31b901b93b992580d608fc2f4db9ddac1d755e43'/>
<id>urn:sha1:31b901b93b992580d608fc2f4db9ddac1d755e43</id>
<content type='text'>
</content>
</entry>
</feed>
