Preserve formatted NAND boot and Wii Remote pairing, add DMA/SRAM conformance tests and a Wii comparison probe. Keep P1 profiling tools and native update A/B evidence; reject the unhelpful targeted SRAM shortcut.
10 KiB
Wii IOS LLE : première trace CPU native de mise à jour
Date : 2026-09-23 (Europe/Paris). Cible : atteindre à terme environ 60 FPS pendant une mise à jour système, sans raccourci HLE ni régression BootMii/HBC. Ce document rapporte une mesure exploratoire, pas un gain de performance.
Périmètre et qualité
- NAND : copie isolée
.starlet_update_ab_20260913/P1-trace-002, créée depuis le journal pré-mise-à-jour vérifié (31 fichiers, SHA du seed07B2F4BC543CFD4203EFC448538505E9D503B2727C16AAFF8D8C0B286D8B4F0C)..starlet_user3et les anciens essais A–F n'ont pas été modifiés. - Build diagnostic figée :
.starlet_update_ab_20260913/build-P1-trace-002; exécutable SHA-256D809E04E2E8E900DB06D3813A67805E66EADB2BB79924CB8E805CB724360EAD4. - ETL source :
.starlet-profile/P1-native-update-001/capture.etl(3,88 Gio), session WPR de 600 s. Le champEndUTCdu manifest inclut environ 100 s de fusion de la trace : ce n'est pas la fin de la collecte. - Analyse :
.starlet-profile/P1-native-update-001-update-window/, Xperf limité à 2026-09-22 22:57:00–23:00:33 UTC. Les échantillons cibles couvrent en fait 114,15 s seulement, jusqu'à l'arrêt de la collecte vers 22:58:52 UTC. Les premières écritures NAND de mise à jour sont observées vers 22:57:23 UTC. La fenêtre CPU comprend donc aussi environ 23 s avant cette première écriture. La fin de la mise à jour, confirmée par l'utilisateur, n'est donc pas profilée. - TDH : 780 781 événements natifs décodés, zéro perte de buffer/événement et zéro erreur de décodage. Fusion Xperf : 25 419 ancres QPC, erreur maximale cinq ticks (QPC 10 MHz), 128 329 échantillons CPU sur 18 threads, 549 607 changements de contexte retenus, zéro événement cible invalide. Les 57 événements Xperf invalides sont hors PID cible.
- Le surcoût du collecteur WPR en mise à jour native n'est pas qualifié par le lot synthétique précédent ; ces FPS ne constituent pas un A/B sans trace.
Observations dans la fenêtre CPU retenue
| Mesure | Valeur |
|---|---|
| Images « produced », intervalle médian | 21,16 ms (≈47,3 FPS) |
| Images « produced », p95 | 35,33 ms (≈28,3 FPS) |
| Images « produced », p99 | 68,58 ms (≈14,6 FPS) |
| Thread principal TID 28212 | 95 154 / 128 329 échantillons (74,2 %) |
| Thread GPU TID 13804 | 16 125 / 128 329 (12,6 %) |
| Thread audio TID 22388 | 5 095 / 128 329 (4,0 %) |
| JIT ARM / JIT PPC, échantillons de feuilles | 27 817 / 16 450 |
| Instructions ARM, delta de snapshots | 4 566 790 374 |
| Instructions ARM JIT natives, delta | 4 522 113 258 |
| Accès lents JIT lecture / écriture, deltas | 59 486 963 / 218 257 365 |
| Fallbacks ARM, delta | 42 433 964 |
Les symboles hôte les plus visibles sur le thread principal comprennent
StarletMemory::Read32 (3 246 échantillons),
ARMCore::TranslateVirtualAddress (2 909), StarletMemory::Write32 (2 613),
PowerPC::MMU::WriteToHardware (2 420) et
StarletMemory::CalculateNANDECC (1 918). Ce sont des feuilles : leur somme
ne décrit pas une pile ni un chemin critique. Le thread GPU occupe aussi du
CPU, mais il ne domine pas ce relevé. Les 218 millions d'écritures lentes
JIT sont un compteur d'appels, pas 218 millions d'accès NAND.
Les compteurs de scopes échantillonnés distinguent NAND, journal, NAT, DMA,
ARM/JIT et périphériques, avec zéro erreur de comptabilité. Ils mesurent du
temps mur de tranches sélectionnées 1/1024, pas une durée CPU exhaustive ; ils
ne justifient donc pas d'affirmer qu'un autre poste est nul. Les événements
Frame et Snapshot natifs couvrent toute la session alors que les
échantillons CPU Xperf sont filtrés ; les chiffres de FPS ci-dessus viennent
de cpu-threads-phase2.json, qui borne les deux à la même fenêtre QPC.
Décision
La première minute de mise à jour est surtout limitée par le thread principal d'émulation, mais aucun helper unique mesuré ne démontre à lui seul les ~21 % de réduction de temps par image nécessaires pour passer de la médiane observée à 60 FPS. Un simple gain de microbenchmark ECC ou TLB ne doit pas être présenté comme un correctif 60 FPS. Les écritures lentes sont le candidat à qualifier : le fast path direct SRAM écrit avait déjà régressé BootMii, donc élargir son masque sans savoir quelles adresses dominent serait risqué.
Prochain essai borné : la nouvelle copie initiale P1-trace-003 est préparée
et vérifiée. Activer -ProfileJitMemory dans cette copie seulement et relever
dans dolphin.log
les compteurs RAM/SRAM/MMIO et les adresses les plus fréquentes pendant le même
début de mise à jour. Ce mode ajoute du coût et ne sert qu'à classer les
adresses, pas à comparer ses FPS à la présente trace. Ensuite seulement,
choisir une optimisation limitée à une famille d'adresses, ajouter des tests de
fidélité BootMii/HBC/NAND et réaliser un A/B sans instrumentation sur deux NAND
identiques. L'objectif de 60 FPS reste ouvert.
Le lancement du relevé ciblé est manuel depuis un PowerShell interactif, car une instance créée par l'outil de commande de l'agent s'est retrouvée invisible sur le bureau utilisateur :
cd C:\Users\tpetkovic\Desktop\dolphin
.\Run-Wii-IOS-LLE.ps1 `
-BuildDirectory .starlet_update_ab_20260913/build-P1-trace-003 `
-UserDirectory .starlet_update_ab_20260913/P1-trace-003 `
-Ethernet -ProfileJitMemory
Fichiers de résultat locaux : decoder-summary.json, xperf-summary.json,
native-report.json, cpu-threads-phase2.json dans le répertoire d'analyse
indiqué ci-dessus. Un export Xperf complet, interrompu car disproportionné,
a été supprimé ; l'ETL source et l'export ciblé sont conservés.
Relevé ciblé P1-trace-003 : écritures SRAM
La copie isolée P1-trace-003 a été démarrée avec -ProfileJitMemory. La mise
à jour est allée jusqu'au redémarrage/menu Wii (confirmé par l'utilisateur).
Le journal a cessé de croître à 2 763 867 232 octets. L'analyse en lecture
seule valide ses 651 690 transactions et 165 568 pages finales superposées.
Le SYSCONF est valide ; les 9 contenus du menu v514 et les 15 d'IOS80 v6944
correspondent à leurs empreintes TMD. SHA-256 du journal :
49b19327a9b0d7c3aa08c4d59e81365aa17b82ef7452939c07281cbd499b5b56.
Cela ne constitue pas une vérification exhaustive de tous les titres.
Entre les snapshots JIT de 11:57:06.905 (début des écritures de mise à jour) et 12:07:12.622 (fin des écritures), soit environ 606 s de temps mur :
| Compteur d'accès ARM lents | Delta |
|---|---|
| SRAM | 1 024 033 027 (78,74 % des accès classés) |
| MMIO | 255 829 918 |
| Autres | 20 598 539 |
| RAM | 0 |
| Lectures, toutes régions | 292 651 794 |
| Écritures, toutes régions | 1 007 809 690 |
| Écritures SRAM | 971 531 207 (96,4 % des écritures lentes) |
Les pages d'aperture SRAM 0x00 et 0x19 portent respectivement
556 332 042 et 348 178 857 écritures lentes, soit 93,1 % des écritures
SRAM de cette fenêtre. L'alias bas n'augmente pas : ce trafic passe par
l'alias haut. Les adresses qui reviennent le plus dans l'échantillonnage
1/256 sont notamment 0xffff97a0 et 0xfffe03c0 en écriture ; les lectures
MMIO comprennent 0x0d800038 et 0x0d80003c. Le classement par page est
exact dans les compteurs, tandis que les adresses individuelles ne sont que
des échantillons (huit adresses au maximum par snapshot).
Conséquence : les écritures SRAM sont un candidat ciblé, pas un gain de
FPS déjà établi. Ce run est instrumenté et ne doit pas être comparé en vitesse
au run natif P1-trace-002. Le JIT conserve volontairement les écritures
SRAM sur le bus exact : une ancienne écriture directe, même limitée aux pages
0x00/0x19, avait bloqué BootMii à son initialisation matérielle. Avant de
réintroduire un fast path, il faut expliquer cette divergence et vérifier
boot0/split/alias/endianness ainsi que le cycle BootMii → menu → HBC. Ensuite,
seul un A/B non instrumenté sur deux copies identiques peut qualifier le gain
sur la mise à jour réelle et la cible de 60 FPS.
Essai SRAM ciblé : rejeté après A/B natif
Un candidat a court-circuité le bus dans le helper JIT uniquement pour les
stores alignés de 32 bits sur les pages SRAM hautes 0x00 et 0x19, avec
gardes boot0/split et chemin bus conservé ailleurs. Le test dédié des gardes
et 153 tests Starlet* ont passé. BootMii puis Wii ont démarré dans le
profil isolé P1-trace-004. HBC est absent de cette NAND ; ce trajet n'a pas
été testé. Le binaire candidat figé (SHA-256
B5F3C3BA1D6EE2C86E5A3EB685F3B3D5FCEF2674C51EA137B697903F9E210006)
reste dans build-P1-trace-005 pour reproduire l'essai, mais le raccourci a
été retiré du source courant après les mesures ci-dessous.
P1-trace-005 (candidat) et P1-trace-006 (témoin, exécutable SHA-256
D809E04E2E8E900DB06D3813A67805E66EADB2BB79924CB8E805CB724360EAD4)
partaient des mêmes 31 fichiers, d'un journal vérifié de 533 705 344 octets
et de la même configuration, hormis les chemins isolés. Le profilage détaillé
était désactivé dans les deux builds. Une mesure hôte légère a relevé toutes
les 10 s la taille du journal et le temps CPU du processus, sans lire la
mémoire invitée ni injecter d'entrée. Les durées ci-dessous interpolent les
franchissements des mêmes seuils de 600 Mo et 2,7 Go ; l'incertitude
temporelle reste de l'ordre de l'intervalle d'échantillonnage.
| Mesure 600 Mo → 2,7 Go | Candidat | Témoin |
|---|---|---|
| Temps mur interpolé | 434,7 s | 402,4 s |
| Temps CPU du processus | 501,5 s | 459,8 s |
| Journal final | 2 763 867 232 octets | 2 733 507 520 octets |
Les deux mises à jour ont abouti et les journaux passent la vérification
complète des transactions. Le SYSCONF est valide ; le menu v514 et IOS80 v6944
ont respectivement leurs 9 et 15 contenus cohérents avec les TMD. L'utilisateur
a aussi trouvé le témoin plus fluide. Aucun flux FPS précis n'a été enregistré
pour cet A/B. C'est un seul passage par variante, avec une taille finale de
journal légèrement différente : il ne démontre pas la taille exacte d'une
régression, mais ne montre aucun gain. Le nombre d'accès SRAM n'était donc
pas, à lui seul, une justification suffisante pour ce raccourci. Ne pas le
promouvoir. Les captures brutes restent dans P1-trace-005/Capture et
P1-trace-006/Capture pour réanalyse.