Seri Bedah Kode RezaOS — Bagian 3: Akuisisi Kendali Grafis via Graphics Output Protocol (GOP)

Setelah menstabilkan lingkungan kerja dan menonaktifkan Watchdog Timer pada bagian sebelumnya, langkah krusial berikutnya dalam pengembangan RezaOS adalah mengambil alih kendali visual. Pada era BIOS Legacy, hal ini dilakukan melalui interupsi INT 10h yang sangat terbatas. Namun, dalam ekosistem UEFI, kita menggunakan Graphics Output Protocol (GOP).

Bagian ini akan membedah proses penemuan (discovery) dan inisialisasi protokol grafis yang memungkinkan kernel memiliki kendali penuh atas setiap piksel di layar.


1. Pergeseran Paradigma: Dari Interupsi ke Protokol

Dalam arsitektur UEFI, perangkat keras tidak diakses melalui nomor interupsi statis, melainkan melalui Protokol. Protokol adalah sekumpulan struktur data dan penunjuk fungsi (function pointers) yang diabstraksikan oleh firmware.

Graphics Output Protocol (GOP) adalah protokol standar yang menggantikan standar VESA BIOS Extensions (VBE). GOP menyediakan cara yang seragam untuk mengakses Linear Framebuffer—sebuah blok memori di mana setiap alamat mewakili warna piksel di layar.


2. Analisis Kode: Mencari Protokol dengan LocateProtocol

Baris kode berikut adalah inti dari proses akuisisi perangkat grafis:

Status = uefi_call_wrapper(SystemTable->BootServices->LocateProtocol, 3, 
                           &GopGuid, NULL, (void**)&Gop);

Bedah Parameter Fungsi:

Fungsi LocateProtocol dipanggil melalui BootServices. Fungsi ini mencari interface pertama di dalam basis data firmware yang cocok dengan protokol yang diminta.

  1. &GopGuid: Ini adalah alamat memori dari GUID (128-bit) yang mewakili GOP. GUID berfungsi sebagai “kunci pencarian” yang unik secara global untuk memastikan firmware memberikan protokol yang tepat, bukan protokol lain.
  2. NULL (Registration): Parameter ini biasanya digunakan jika kita ingin mencari protokol berdasarkan kunci registrasi spesifik. Karena kita hanya ingin mencari protokol grafis pertama yang tersedia, kita memberikan nilai NULL.
  3. (void**)&Gop: Ini adalah parameter output. Jika fungsi berhasil menemukan GOP, alamat memori dari struktur protokol tersebut akan disimpan ke dalam pointer Gop yang telah kita deklarasikan sebelumnya. Casting ke (void**) diperlukan karena fungsi ini bersifat generik untuk berbagai jenis protokol.

3. Peran uefi_call_wrapper dalam Konteks GOP

Seperti yang sempat dibahas pada bab sebelumnya, penggunaan uefi_call_wrapper di sini sangat vital. Karena LocateProtocol adalah fungsi milik firmware (yang menggunakan konvensi pemanggilan Microsoft x64), dan kita menggunakan toolchain GNU-EFI di lingkungan Linux (Fedora), wrapper ini bertindak sebagai penerjemah register CPU. Tanpa wrapper ini, argumen yang kita kirimkan bisa berakhir di register yang salah, menyebabkan system hang atau General Protection Fault.


4. Validasi Status dan Penanganan Kesalahan (Error Handling)

Dalam pemrograman sistem, kita tidak boleh berasumsi bahwa hardware selalu tersedia. Oleh karena itu, pengecekan status adalah kewajiban:

if (EFI_ERROR(Status)) {
    Print(L"Gagal memuat GOP: %r\n", Status);
    return Status;
}

Analisis Teknis:

  • EFI_ERROR(Status): Ini adalah makro yang memeriksa bit paling signifikan dari nilai Status. Jika bit tersebut bernilai 1, berarti telah terjadi kesalahan fatal.
  • %r dalam Print: Ini adalah format specifier khusus UEFI. Alih-alih mencetak angka kode kesalahan yang sulit dipahami (seperti 0x8000000000000003), %r akan menerjemahkan kode tersebut menjadi teks yang manusiawi, misalnya: Device Error atau Not Found.
  • Mekanisme Fail-Safe: Jika GOP gagal ditemukan (misalnya pada sistem yang hanya mendukung Headless Mode), program akan berhenti dan memberikan kendali kembali ke firmware UEFI daripada melanjutkan eksekusi yang buta warna.

Kesimpulan Bagian 3

Proses LocateProtocol adalah momen di mana RezaOS melakukan negosiasi dengan firmware untuk mendapatkan akses ke kartu grafis. Dengan berhasilnya pemanggilan ini, kita kini memiliki pointer Gop yang memegang kunci menuju FrameBufferBase—pintu gerbang utama untuk menggambar antarmuka sistem operasi modern.


Langkah Selanjutnya:

Pada bagian keempat, kita akan membedah bagaimana cara mengekstrak informasi detail dari protokol yang sudah kita dapatkan, termasuk resolusi horizontal, vertikal, dan alamat fisik memori video.