At boot it checks for savedata space with SIZES and said there was none:
the default 16GB stick, with no save yet, comes to 2^34 bytes, which is
0 in 32 bits. Saving worked fine when told to go ahead anyway.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The loader thread writes memory, kernel objects and the symbol map
without g_frameMutex, and fires SYMBOL_MAP_UPDATED for every module it
loads. Each one made the GUI thread refill the symbol lists while the
loader went on adding symbols, so booting the XMB (which loads a long
chain of modules there) with the disassembly window open crashed in
SymbolMap::FillSymbolListBox.
Readers holding g_frameMutex now also check the new PSP_IsBooting() and
skip while it's true. BOOT_DONE refills the lists once the boot is done.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both its lists offered everything bootable, the XMB, homebrew and PS1
games included, though only what UmdMount takes can go in the drive.
The new UMDS_ONLY browse flag keeps PSP disc images and disc folders.
ISOs and CSOs are trusted by extension so big folders stay quick to
list; CHDs and PBPs are identified, since they can be PS1 games.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
So it gets a usable portrait layout: a title bar with a back button, the
game list, and the Load button below it. Landscape keeps its old shape,
with Back replacing the Cancel button.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A drag that only shows up in the UP event (a quick flick with few or no
MOVE events in between) now cancels the press instead of clicking.
- A press that stops a moving list only stops it, as in Android's lists.
- Android's ACTION_CANCEL is passed on as UP | CANCEL rather than a plain UP,
so a gesture the system takes over doesn't click wherever the finger was.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Booting the XMB from a 6.60 firmware checks 40 command 1 signatures, at
55ms each in a Release build, since the bignum code worked a byte at a time
and did a full modular inversion for every point addition and doubling.
Now it works on 32-bit words (plain C, so the same on ARM), keeps points in
Jacobian coordinates with one inversion at the end, and computes u1*G + u2*Q
for verification in one pass. A verify takes 79us, and a 30 second XMB boot
in headless went from 2.96s to 0.79s.
Results are unchanged, including command 0xC's private key coming out
multiplied by 2^168 mod N, which the old Montgomery form did.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Command 1's ECDSA check, behind every ECDSA-signed (type 6) module, takes
55ms in a Release build, and booting the XMB from a 6.60 firmware does it
40 times. The vectors are signatures from those modules.
kirk1_ecdsa_verify() factors the check out of kirk_CMD1 so the test can
call it without building a whole command 1 block.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The provider answers a taken name with a renamed copy, "name (1)" or
"name (1).ext", but it also replaces characters FAT doesn't allow with '_',
which isn't a conflict. Create, copy and rename now only report
ALREADY_EXISTS (and undo) for the numbered form of the sanitised name.
Also take the image picker's result from ClipData when there's no data URI,
like the document picker does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A query on a second authority closed the cached client while another
thread could still be using it. Now each authority keeps its own client,
dropped only when its provider dies.
docs/android-todo.md lists the review findings left for later (image picker
decoding on the main thread, the VR exit in onDestroy, the achievements
host override receiver), and android-device-testing.md describes the
LeakCanary/StrictMode setup.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The screen under a popup is only laid out, not recreated, so the grid kept the
cell size it was created with.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The grid and the list each get their own icon size (GameGridScale and the new
GameListScale), changed by the zoom shortcuts and the settings popup for the
view mode of the browser it's opened from. A saved view of 2 (the old large
list) reads as the list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A recreate (font scale, resolution change) re-sent the launch intent's
game to native, which booted it over whatever was running.
- Exceptions in posted commands (bad parameters, setPrimaryClip) no longer
crash the app; the request is answered as failed.
- Close tombstone streams and the free-space fd on error paths.
- Keep the CameraHelper across graphics restarts (it leaked a SurfaceTexture).
- Don't treat an unreadable document name as a name conflict, which deleted
the file just created.
- Tree picker: convert to a document URI even if the persistable grant fails.
- ShortcutActivity: don't open a second picker on recreate, and finish when
the old file chooser is backed out of.
- Skip null names/MIME types in listings, null device in the Joy-Con check.
Debug builds now set a StrictMode VM policy (leaked closables, registrations,
activities), and -PleakCanary adds LeakCanary to debug builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
protoc was still on 3.25.3 while the runtime was on 4.x; both are now 4.36.2.
appcompat stays at 1.7.1, since 1.8.0 needs minSdk 23.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The XMB polls scePowerGetBatteryLifePercent about once a second and draws
it in its status bar. When running the VSH, return the host's battery
level there and in the power callback's percentage bits. Games still see
a full battery, so a run doesn't depend on the host's charge.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The two columns of loose text didn't fit in portrait. Now the status, warnings
and folders are in groups on the left (or on top), and Move Data and OK on the
right (or below). The move's progress gets a progress bar.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Loading a .ppmap cleared the map first, which also forgot which modules were
loaded and where. The file's modules came back at the addresses they had when
it was saved, and none of them active, so every symbol in a module vanished
until that module happened to load again. It now merges into the map: the
file's modules are matched to ours by name, and its names win.
Unnamed data was saved with "(null)" as its name, which came back as a label,
and data without a name was dropped on load.
The no$ format only has absolute addresses, so it now only saves functions of
loaded modules, and loading attaches them to the module they're in.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>