- Proyek porting untuk menjalankan Mac OS X 10.0 (Cheetah) secara native dengan memanfaatkan perangkat keras berbasis PowerPC milik Wii telah rampung
- Kernel Darwin/XNU dimodifikasi agar sesuai untuk Wii, dan bootloader, device tree, serta driver ditulis langsung hingga berhasil boot sampai lingkungan GUI
- Driver IOKit kustom yang mendukung kartu SD, framebuffer, dan perangkat input USB diimplementasikan untuk mencapai operasi sistem yang lengkap
- Struktur khas Wii turut diakomodasi, seperti perbaikan konflik pengaturan BAT, pembangunan lapisan driver untuk Hollywood SoC, dan framebuffer konversi RGB→YUV
- Setelah lebih dari 10 tahun percobaan, proyek ini mewujudkan boot penuh dan pengoperasian Mac OS X di Wii, sekaligus membuktikan nilai tantangan dari proyek yang tampak mustahil
Gambaran proyek menjalankan Mac OS X di Wii
- Proyek porting dilakukan untuk menjalankan Mac OS X 10.0 (Cheetah) secara native di Nintendo Wii
- Wii sebelumnya sudah pernah menjadi target porting OS seperti Linux, NetBSD, dan Windows NT, dan kini Mac OS X ikut ditambahkan ke daftar itu
- Dengan memanfaatkan perangkat keras berbasis PowerPC milik Wii, proyek ini menjalankan kernel Darwin/XNU dan menulis sendiri driver serta bootloader yang dibutuhkan
- Hasilnya, Wii berhasil melakukan boot penuh hingga lingkungan GUI Mac OS X, lengkap dengan dukungan input keyboard dan mouse
Meneliti kelayakan
- CPU PowerPC 750CL pada Wii merupakan penerus PowerPC 750CXe yang digunakan pada G3 iMac/iBook, sehingga tidak ada masalah kompatibilitas CPU
- RAM 88MB pada Wii (MEM1 24MB + MEM2 64MB) memang lebih kecil dari spesifikasi resmi (128MB), tetapi pengujian QEMU menunjukkan sistem tetap bisa boot dengan 64MB
- Perangkat keras yang didukung meliputi USB Gecko (debugging serial), kartu SD, interrupt controller, output video framebuffer, dan port USB
- Jika inti open source Mac OS X, yaitu Darwin (kernel XNU, IOKit), dimodifikasi agar sesuai dengan Wii, maka lapisan GUI di atasnya juga dapat berjalan
- Wii memungkinkan eksekusi kode buatan sendiri melalui Homebrew Channel dan BootMii, sehingga cocok untuk eksperimen porting
Pendekatan porting
- Dipilih satu dari tiga strategi boot:
- Porting Open Firmware
- Porting BootX
- Menulis langsung bootloader kustom
- Sebuah bootloader khusus Wii ditulis dari nol untuk melakukan inisialisasi hardware, memuat kernel, membuat device tree, dan menyerahkan kendali ke kernel
- Setelah kernel berjalan, kode bootloader tidak lagi diperlukan, dan tahap berikutnya berfokus pada patch kernel serta penulisan driver
Menulis bootloader
- Berdasarkan kode contoh ppcskel, diimplementasikan inisialisasi Wii serta fungsi kartu SD, framebuffer, dan debugging USB
- Kernel XNU berformat Mach-O dimuat ke memori lalu dijalankan dengan lompat ke entry point yang ditentukan
- Untuk memastikan kernel benar-benar berjalan, disisipkan patch kedipan LED guna melacak tahap masuk ke kernel
- Dengan menelusuri balik jalur eksekusi kernel, ditemukan exception 300 pada tahap device_tree.c → disadari perlunya mengirim device tree
-
Membuat dan mengirim device tree
- Dibangun tree minimum yang di-hardcode berdasarkan struktur hardware Wii yang tetap (
/cpus, /memory)
- Pointer device tree dimasukkan ke struktur
boot_args dan dikirim ke kernel
- Setelah itu kernel dapat mengenali tree dengan benar dan proses boot berlanjut
Patch kernel
- Pengaturan BAT (Block Address Translation) pada XNU bentrok dengan peta memori Wii sehingga sumber kernel perlu dimodifikasi
- Lingkungan build kernel disusun di guest Mac OS X Cheetah (QEMU)
- Setelah perbaikan BAT dan penambahan redirect output konsol ke USB Gecko, proses debugging menjadi memungkinkan
- Berikutnya memori virtual, IOKit, dan subsistem BSD berhasil diinisialisasi dengan normal
- Pada log boot muncul pesan “Still waiting for root device” → menandakan perlunya driver kartu SD
Menulis driver
-
Memahami struktur IOKit
- IOKit adalah framework ekstensi kernel berbasis C++ yang merepresentasikan lapisan hardware melalui struktur driver-nub
- Contoh:
IOPCIBridge → IOPCIDevice → SomeEthernetCard → IOEthernetInterface
- Karena Wii memakai struktur SoC (Hollywood), bukan bus PCI, dibutuhkan driver kustom pengganti IOPCIFamily
-
Driver Hollywood
- Driver
NintendoWiiHollywood ditulis untuk dicocokkan dengan node “hollywood” pada device tree
- Driver ini membuat dan mendaftarkan nub
NintendoWiiHollywoodDevice untuk merepresentasikan hardware di bawahnya
- Dengan begitu, driver perangkat turunan seperti kartu SD dapat terhubung
-
Driver kartu SD
- Akses kartu SD Wii diimplementasikan dengan mewarisi
IOBlockStorageDevice
- Komunikasi dengan kartu SD dilakukan memakai perintah IPC milik MINI (koprosesor Starlet), yaitu
IPC_SDMMC_SIZE, READ, dan WRITE
- Untuk mengatasi masalah memori cache, digunakan buffer memori non-cache
- Hasilnya, nub
IOMedia berhasil dibuat sehingga filesystem root dikenali dan boot penuh menjadi mungkin
- Pada log boot muncul
BSD root: disk0s4
-
Driver framebuffer
- Dengan mewarisi
IOFramebuffer, area MEM1 Wii (0x01700000) ditetapkan sebagai framebuffer
- Untuk perpindahan antara konsol teks awal dan GUI,
isConsoleDevice() dibuat mengembalikan true
- Karena hardware video Wii memakai format YUV, diimplementasikan double framebuffer untuk konversi RGB→YUV
- Melalui loop konversi, konversi warna dilakukan pada 60Hz → GUI tampil dengan warna normal
-
Dukungan input USB
- Untuk menjalankan kontroler USB 1.1 OHCI milik Wii, dicoba penggunaan
AppleUSBOHCI
- Masalah 1: tidak ada source IOUSBFamily, sehingga debugging tidak bisa dilakukan
- Masalah 2: ketergantungan pada IOPCIDevice, sehingga dibuat
NintendoWiiHollywoodPCIDevice palsu khusus Wii
- Masalah 3: ketidakcocokan endian (Wii memakai reversed-little-endian), sehingga byte-swap software perlu dihapus
- Setelah memperoleh source IOUSBFamily untuk Mac OS X Cheetah melalui IRC, source tersebut dimodifikasi dan berhasil di-build
- Hasil akhirnya, input keyboard dan mouse USB berfungsi, dan Wii bekerja sebagai sistem Mac OS X yang lengkap
Penyempurnaan bootloader dan kernel
-
Penyempurnaan bootloader
- Ditambahkan pencarian partisi kartu SD dan menu boot, serta diimplementasikan parsing Apple Partition Map (APM)
- Ekstensi kernel (kext) dimuat dari bootloader lalu didaftarkan ke node
/chosen/memory-map
- Dengan cara ini, sistem dapat boot menggunakan image instalasi Mac OS X yang tidak dimodifikasi
-
Penyederhanaan kernel
- Modifikasi kernel khusus Wii diminimalkan:
- perbaikan pengaturan BAT
- pengenalan alamat I/O berbasis node “hollywood”
- perbaikan koherensi cache framebuffer
- Driver dipisahkan dari kernel untuk meningkatkan efisiensi build dan kemudahan pemeliharaan
Penutup
- Proyek yang pertama kali dibayangkan saat kuliah pada 2013 akhirnya selesai lebih dari 10 tahun kemudian
- Tantangan ini terinspirasi dari kasus porting Windows NT ke Wii
- Pada akhirnya berhasil dicapai boot penuh dan pengoperasian GUI Mac OS X 10.0 di Wii
- Ditekankan pelajaran bahwa “semakin mustahil sebuah proyek terlihat, semakin layak ia untuk dicoba”
Belum ada komentar.