Faire tourner Mac OS X Cheetah sur Nintendo Wii : Analyse approfondie du portage
Un développeur a réussi à démarrer le Mac OS X Cheetah original sur une Nintendo Wii en utilisant son processeur PowerPC 750CL. Ce chip dérive du PowerPC 750CXe présent dans les iBook G3 et iMac G3, offrant une compatibilité solide au niveau CPU.
La Wii embarque 88 Mo de RAM : 24 Mo 1T-SRAM (MEM1) et 64 Mo GDDR3 (MEM2). Cheetah demande officiellement 128 Mo, mais des tests QEMU ont prouvé qu'il tourne bien avec 64 Mo. Les fonctionnalités clés prises en charge incluent :
- Sortie série via USB Gecko ;
- Démarrage depuis carte SD ;
- Contrôleurs d'interruptions ;
- Sortie vidéo vers framebuffer ;
- USB pour souris et clavier.
Le noyau XNU open-source de Darwin et IOKit gèrent les pilotes sans accroc. Les parties closed-source comme Quartz et Finder se lancent sans patch une fois le noyau opérationnel.
Processus de démarrage : D'Open Firmware à la Wii
Sur les Mac PowerPC, le démarrage passe par Open Firmware, qui construit l'arbre des périphériques, puis BootX charge le noyau Mach-O. La Wii s'appuie sur le homebrew via Homebrew Channel et BootMii.
L'approche utilise un chargeur personnalisé basé sur ppcskel : init Wii, chargement de XNU depuis SD, construction de l'arbre des périphériques, saut vers le noyau. Éviter un portage complet d'Open Firmware ou BootX a permis de rester léger en supprimant le support multi-matériel.
Analyse Mach-O et lancement du noyau
Le chargeur dissèque les commandes de chargement Mach-O et mappe les segments :
0x00000000: Vecteurs d'exceptions
0x00011000: LC_SEGMENT __TEXT
0x002e0000: LC_SEGMENT __DATA
0x00367000: LC_SEGMENT __KLD
0x00395000: LC_SEGMENT __LINKEDIT
0x00434000: LC_SEGMENT __SYMTAB
0x004d3000: LC_SEGMENT __HEADER
Appel de lancement : ((void ()())kernel_entry_point)(boot_args_address, MAC_OS_X_SIGNATURE);. L'écran noircit — le noyau prend les commandes.
Débogage via patching : Échange d'instructions pour toggler la LED de la Wii à 0x0D8000C0 :
lis r5, 0xd80
ori r5, r5, 0xc0
lwz r4, (r5)
sync
xori r4, r4, 0x20
stw r4, (r5)
Le désassembleur Hopper a cartographié les fonctions XNU. Séquence d'initialisation :
- start.s : start
- start.s : allStart
- start.s : nextPVR
- start.s : donePVR
- start.s : doOurInit
- start.s : noFloat
- start.s : noVector
- start.s : noSMP
- start.s : noThermometer
- ppc_init.c : ppcInit
- pe_init.c : PE_INIT_PLATFORM
- device_tree.c : find_entry (crash 300)
Crash sur exception 300 : arbre des périphériques manquant.
Arbre des périphériques et boot_args
L'arbre des périphériques est une carte hiérarchique du matériel. Pour la Wii, une version codée en dur issue de Wii Linux démarre minimaliste :
/
├── cpus
│ └── PowerPC,750
└── memory
Étoffé au besoin. Structure boot_args :
typedef struct boot_args {
u16 Revision;
u16 Version;
// ... (structure complète passée au noyau)
};
Le chargeur patch le noyau à la volée pour les tests.
Points clés
- Le PowerPC 750CL de la Wii fait tourner Cheetah sans retouche CPU ;
- 88 Mo de RAM suffisent pour un démarrage basique, vérifié par QEMU ;
- Chargeur ppcskel personnalisé réduit la surcharge ;
- Analyse Mach-O et patching LED déverrouillent le débogage XNU ;
- Arbre des périphériques codé en dur accélère le boot sur hardware fixe.
— Editorial Team
Aucun commentaire pour le moment.