¿Necesito SSDT-AWAC en mi Hackintosh?

Basado en el texto publicado por los autores de OpenCore titulado Fixing System Clocks dentro de la sección Getting Started With ACPI del cual en gran parte es una traducción.

Real-time clock (RTC)

Un reloj en tiempo real (RTC) es un reloj que funciona con pila o batería y que se incluye en un microchip en la placa base de un ordenador. Suele estar separado del microprocesador y se denomina «CMOS» (Complementary Metal Oxide Semiconductor). Su función es mantener una corriente cuando la placa base se apaga y/o es desconectada de la corriente eléctrica y, de esta forma, evitar que la BIOS se desconfigure cada vez que se apaga el ordenador.
Una pequeña memoria en este microchip almacena la descripción del sistema o los valores de configuración, incluidos los valores de tiempo almacenados por el RTC. Cuando encendemos el ordenador, la BIOS lee la hora actual desde la memoria en el chip con el RTC.
Aunque el término RTC normalmente se refiere a dispositivos en ordenadores y sistemas embebidos, los RTC están presentes en la mayoría de los aparatos electrónicos que necesitan guardar el tiempo exacto.

Placas base con chipset Intel series 300

Algunos fabricantes de placas base Intel, sobre todo de la serie 300 (B360, B365, H310, H370, Z370, Z390, B460, Z490, etc.) han implementado un nuevo tipo de reloj del sistema llamado AWAC (ACPI Wake Alarm Counter Clock). El problema es que macOS no sabe manejar AWAC y, en su lugar, espera encontrar el clásico RTC. Esto puede ocasionar problemas como la desconfiguración de la BIOS en cada apagado o errores importantes al arrancar el sistema operativo. La solución pasa por traer de vuelta el RTC para que macOS pueda funcionar correctamente. Esto es lo que se busca con los archivos SSDT-AWAC y SSDT-RTC0. Cada uno de ellos funciona de forma diferente:

SSDT-AWAC: deshabilita AWAC y y habilita RTC. En nuestro DSDT generalmente hay una variable llamada STAS que determina qué reloj utilizar, One para RTC y Zero para AWAC
SSDT-RTC0: crea un falso dispositivo RTC para macOS cuando el DSDT no tiene la opción de utilizar el RTC clásico.

¿Cómo saber si necesito uno de estos SSDT?

Para saber esto has de obtener el DSDT de tu sistema en formato AML y descompilarlo a formato ASL para que puedas leerlo con un editor de texto (ver más abajo).

  1. Busca en el archivo DSL el texto Device (AWAC). Si no se encuentra ninguna coincidencia (el reloj AWAC no existe), no es necesario que continúes. No tienes dispositivo AWAC y no necesitas ninguno de estos DSDT.
  2. Si el texto Device (AWAC) existe, busca el texto STAS. Si este texto existe, significa que se puede forzar la utilización del RTC clásico mediante SSDT-AWAC.aml que es el archivo que has de emplear en este caso.
  3. Si el texto Device (AWAC) existe pero no el texto STAS, has de usar SSDT-RTC0.aml pero es conveniente saber cómo se llama el dispositivo LPC en nuestro DSDT. SSDT-RTC0 por defecto utiliza LPCB pero en el DSDT puede llamarse así o también LBC o incluso LBC0. Puedes averiguarlo buscando el texto Name (_ADR, 0x001F0000) que corresponde al dispositivo LPC (Low Pin Count) y comprobar cómo se llama realmente en tu sistema para corregirlo si es necesario en SSDT-RTC0.

Por ejemplo, si en tu DSDT se llama LPCB:

            Device (LPCB)
            {
                Name (_ADR, 0x001F0000)  // _ADR: Address
                Method (SPTS, 1, NotSerialized)
                {
                    SLPX = One
                    SLPE = One
                    If (PWBT)
                    {
                        PBEN = One
                    }
                }

no tendrías que hacer ninguna corrección en el archivo SSDT. Pero si tuviese otro de los nombres posibles, habría que corregirlo. El archivo SSDT-RTC0 tiene este contenido:

DefinitionBlock ("", "SSDT", 2, "ACDT", "RTC0", 0x00000000)
{
    External (_SB_.PCI0.LPCB, DeviceObj)    // (from opcode)

    Scope (_SB.PCI0.LPCB)
    {
        Device (RTC0)
        {
            Name (_HID, EisaId ("PNP0B00"))  // _HID: Hardware ID
            Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
            {
                IO (Decode16,
                    0x0070,             // Range Minimum
                    0x0070,             // Range Maximum
                    0x01,               // Alignment
                    0x08,               // Length
                    )
                IRQNoFlags ()
                    {8}
            })
            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                If (_OSI ("Darwin")) {
                    Return (0x0F)
                } Else {
                    Return (0);
                }
            }
        }
    }
}

Las 2 apariciones de LPCB quedarían sin modificar o serían cambiadas a LBC o LBC0, según cada caso.

¿Cómo obtener DSDT.aml del sistema? (ACPI dump)

AML (ACPI machine Language) es el código que utiliza ACPI. Es independiente de la plataforma. El código AML es interpretado cuando se leen cada una de las tablas ACPI.
ASL (ACPI source language) es el código fuente utilizado por ACPI. Se pude editar con editores de texto.
Para convertir AML a ASL y viceversa es necesario emplear un compilador. El más utilizado es iasl (Intel ACPI source language optimizing compiler and dissasembler), utilidad libre incluida en distribuciones Linux y que también tiene versiones para macOS y para Windows.
La versión para macOS se puede descargar desde el repositorio de RehabMan entre otros sitios.
La versión para Windows se puede obtener incluida en el paquete Windows Binay Tools desde la web acpica.org.

Extraer DSDT en macOS con Clover

Si usas Clover, esta es una de las formas más sencillas de obtener DSDT.aml. Simplemente hay que pulsar F4 en la pantalla del menú de Clover y el archivo se genera en la partición EFI, en EFI/Clover/acpi/origin, junto a otros archivos que no son interesantes para la tarea que nos ocupa.
El archivo DSDT.aml no se puede leer tal cual, es necesario descompilarlo al formato DSL. Para ello, desde Terminal:

> iasl DSDT.aml 

Intel ACPI Component Architecture
ASL+ Optimizing Compiler/Disassembler version 20180427(RM)
Copyright (c) 2000 - 2018 Intel Corporation

File appears to be binary: found 88786 non-ASCII characters, disassembling
Binary file appears to be a valid ACPI table, disassembling
Input file DSDT.aml, Length 0x408B7 (264375) bytes
ACPI: DSDT 0x0000000000000000 0408B7 (v02 ALASKA A M I    01072009 INTL 20180427)
Pass 1 parse of [DSDT]
Pass 2 parse of [DSDT]
Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)
Parsing completed
Disassembly completed
ASL Output:    DSDT.dsl - 1853692 bytes

El resultado es un archivo DSDT.dsl en el que podemos hacer las búsquedas relativas al RTC.

Extraer DSDT en Windows

Del paquete Windows Binary Tools solamente vamos a utilizar iasl.exe y acpidump.exe.

Para extraer las tablas al directorio actual:

> acpidump -b

Se obtienen, como en el caso de macOS, una serie de archivos de los que sólo nos interesa dsdt.dat (en Windows el archivo AML obtenido tiene extensión dat). El proceso para descompilar el archivo DSDT es muy parecido a macOS:

> iasl -d dsdt.dat

Intel ACPI Component Architecture
ASL+ Optimizing Compiler/Disassembler version 20200925
Copyright (c) 2000 - 2020 Intel Corporation

File appears to be binary: found 88982 non-ASCII characters, disassembling
Binary file appears to be a valid ACPI table, disassembling
Input file dsdt.dat, Length 0x40AAB (264875) bytes
ACPI: DSDT 0x0000000000000000 040AAB (v02 ALASKA A M I    01072009 INTL 20160527)
Pass 1 parse of [DSDT]
Pass 2 parse of [DSDT]
Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)
Parsing completed
Disassembly completed
ASL Output:    dsdt.dsl - 1980764 bytes

El resultado es un archivo dsdt.dsl en el que también podemos hacer las búsquedas relativas al RTC.

Nota: los archivos SSDT han de colocarse en la Carpeta EFI/Clover/ACPI/patched (Clover) o EFI/OC/ACPI (OpenCore). En OpenCore también hay que añadirlos en el archivo config.plist.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.