NVRAM nativa en la placa Z390 Aorus Elite

Cómo conseguir que la CMOS almacene datos básicos de configuración de macOS, como se hace en los ordenadores de Apple, en placas base modernas con chipset Intel Z390, entre otros, que carecen de esa posibilidad por diseño, mejorando el funcionamiento del Hackintosh y acercándolo más al de un verdadero Mac.

(Artículo basado en otro de los autores de OpenCore, en Dortania)

¿Qué es la NVRAM?

NVRAM (memoria de acceso aleatorio no volátil, non-volatile random access memory) es una pequeña porción de memoria que los Mac utilizan para guardar algunas configuraciones de forma que estén disponibles aunque se apague la corriente eléctrica, por ejemplo información sobre los fallos recientes del kernel, volumen del sonido, resolución de pantalla, disco de arranque seleccionado, zona horaria y otros parámetros básicos. Esta memoria se mantiene gracias a la pila eléctrica de la placa base. Si está pila es retirada o se agota, los datos almacenados y la configuración personalizada de la BIOS se pierden.

NVRAM en las placas con chipset Z390

En estas placas de diferentes fabricantes Intel ha declarado el firmware de una manera que impide que macOS pueda conocer la región del mapa de memoria UEFI en que se encuentra la NVRAM. Esto tiene consecuencias negativas, incluida la de no guardar estas configuraciones básicas entre reinicios.

Hasta hace unos meses, Clover solucionaba esto de forma parcial mediante lo que se llama NVRAM emulada (emulated NVRAM), colocando en la raíz de la partición EFI un archivo de texto nvram.plist en el que se escriben los datos y creando unos scripts que se ejecutan al apagar y al encender el sistema de forma que esos datos se guardan en ese archivo al apagar y se leen y cargan en memoria de nuevo al encender.

Este concepto es diferente a lo que llamamos NVRAM nativa (native NVRAM) cuando los parámetros se escriben directamente en la memoria de la placa base y desde ahí están accesibles al kernel de macOS directamente.

SSDT-PMC.aml

Los programadores de OpenCore han ideado un método que permite tener NVRAM nativa en estos chipsets. Han creado un archivo SSDT-PMC.aml que se coloca en la carpeta EFI/Clover/ACPI/patched (Clover) o EFI/OC/ACPI (OpenCore) y consigue el efecto buscado. Este SSDT requiere para funcionar que en el DSDT exista el dispositivo LPCB que por suerte es habitual en placas con chipset Z390. En caso de duda, busca el texto PCI0.LPCB en tu DSDT (aquí tienes un artículo que explica cómo extraer el DSDT y buscar texto en él).

En sitios de Internet este SSDT se encuentra también como SSDT-NVRAM.aml, son equivalentes y su función es la misma. El texto de SSDT-PMC es corto:

DefinitionBlock ("", "SSDT", 2, "Slav", "PMCR", 0x00001000)
{
    External (_SB_.PCI0.LPCB, DeviceObj)    // (from opcode)

    Scope (_SB.PCI0.LPCB)
    {
        Device (PMCR)
        {
            Name (_HID, EisaId ("APP9876"))  // _HID: Hardware ID
            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                If (_OSI ("Darwin"))
                {
                    Return (0x0B)
                }
                Else
                {
                    Return (Zero)
                }
            }

            Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
            {
                Memory32Fixed (ReadWrite,
                    0xFE000000,         // Address Base
                    0x00010000,         // Address Length
                    )
            })
        }
    }
}

Si utilizas este SSDT después de haber usado NVRAM emulada con Clover, conviene borrar los scripts y elementos relacionados que fueron instalados por Clover y que ya no son necesarios. Hay que borrar estos archivos (algunos pueden no existir en tu sistema):

/Volumes/EFI/EFI/CLOVER/drivers/UEFI/EmuVariableUefi-64.efi
/Volumes/EFI/nvram.plist
/etc/rc.clover.lib
/etc/rc.boot.d/10.save_and_rotate_boot_log.local
/etc/rc.boot.d/20.mount_ESP.local
/etc/rc.boot.d/70.disable_sleep_proxy_client.local.disabled
/etc/rc.shutdown.d/80.save_nvram_plist.local

¿Cómo saber si tengo NVRAM nativa?

Podemos ver los elementos almacenados en la NVRAM con el comando de Terminal nvram -p. También podemos verlos con la herramienta Hackintool. Para comprobar que los datos se guardan después de apagar el PC, hay que crear una clave personal en la NVRAM, reiniciar y ver si la clave creada por nosotros sigue ahí. Por ejemplo

sudo nvram fakesmc-yo=prueba

crea en NVRAM una clave nueva que se llama fakesmc-yo y cuyo valor es prueba. Después de reiniciar volvemos a ejecutar nvram -p y, si nuestra clave sigue existiendo, tenemos NVRAM nativa.

> nvram -p
EFILoginHiDPI	%00%00%00%00
prev-lang:kbd	%00
security-mode	none
fakesmc-key-BNum-ui8	%00
csr-active-config	g%00%00%00
fmm-computer-name	OSX11
boot-args	vsmcgen=1
SystemAudioVolume	F
run-efi-updater	No%00
fakesmc-key-BEMB-flag	%00
fakesmc-yo	prueba

Nota: para vaciar la NVRAM, lo que puede ser necesario en algunas ocasiones, hay 2 métodos dependiendo del gestor de arranque.

  • Clover: pulsa F11 en el menú
  • OpenCore: selecciona ResetNvram o CleanNvram. Para que esto funcione, en config.plist hay que tener Misc / Security / AllowNvramReset=Yes.

5 respuestas a «NVRAM nativa en la placa Z390 Aorus Elite»

  1. Vaya pasada de página, muy buena y en español, creo que hablamos anteriormente sobre una gráfica que no me funcionaba bien, jeje, bueno ahora parece que me surgen nuevas dudas.
    Me atreví a hacer una nueva instalación limpia de OpenCore. Te pongo un poco en antecedentes: poseo una vieja
    – placa base MSI P55-GD65
    – procesador i5-750 serie Linnfield 1 generación
    – 8g RAM ddr3.
    La placa es vieja y es legacy del 2010, no tengo vídeo dedicado pero si una gráfica, la misma que tu, pero:
    – ATI RADEON Shappire RX 580 8 GDR5 con salidas: 2DP,2 HDMI, 1 DVI.

    He seguido las guías oficiales de OpenCore para realizar una instalación lo mas pulcra posible, el sistema va más o menos bien, para los años que tiene, sobre una instalación de Catalina 10.15.7 (última). Tuve un problema ya que no reiniciaba adecuadamente y, en un foro chino, saqué la solución, una maldita variable de los estados ACPI FadtEnableReset, la dejé como true y con eso se me arregló.

    Mis siguientes retos son los siguientes: en Clover fue mucho mas fácil pero no conseguí emular correctamente la NVRAM, he seguido las guías de OpenCore sobre la emulación de la NVRAM, sospecho que al no tener una placa x99 o x299 o b360 no sería necesario SSDT-PMC. Ni tampoco limpiar Clover ya que estoy arrancando de una instalación limpia de OpenCore. He intentado habilitar las variables del config.plist y ejecutar LogoutHook.comand, dando derechos chmod 777 o+x sobre las carpetas y el archivo, mi experiencia es que si fuerzo la ejecución del mismo con sh, sí me crea /EFI/NVRAM.plist, si edito el archivo NVRAM.plist sí veo el contenido de las variables, y el script LogoutHook.comand parece ser que sí se ejecuta en cada reinicio, el caso es que luego no guarda el valor de las variables en cada reinicio, si ejecuto por ejemplo su nvram pepe=pepa ni rastro de pepe en el reinicio, así que no se como emular correctamente mi NVRAM en este equipo antiguo.

    Otra pregunta sin abusar de tu amabilidad, ya que estamos, jeje, así puedo aprender una cosa que me gusta bastante. Con Clover ni OpenCore, de forma nativa, conseguía una aceleración gráfica, así que he usado una configuración de smbios de iMacPro1,1 con el argumento shikigva=128, según lo que leí es el más adecuado para solo DGPU, sin IGPU. El caso es que si uso la aplicacion cliente Emby, una aplicación que sirve para conectarse a un servidor de películas, esta se cuelga apareciendo pantallazos, imagino que será por este tipo de cosas. Podría de alguna manera definir mi procesador i5 750 o falsificarlo, en fin son preguntas complejas pero en Windows la aplicación Emby y mi gráfica funcionan de una mejor forma. Sería cuestión, si se puede, de forzar mi micro con una definición de Smbios y una gráfica dedicada.

    Gracias y perdona por la parrafada. Dentro de poco quiero cambiar de pc y me ha ayudado mucho tu elección de placa base y como tratas los temas, increible página, muchas gracias.

    1. Hola, Rubén, gracias por tus comentarios. Te escribiré más despacio que tus consultas requieren algo de tiempo. Ahora solamente es para que sepas que te he leído. Pero dime:
      ¿Qué bootloader usas ahora, OpenCore o Clover? ¿qué versión?
      ¿Qué extensiones? ¿Lilu y WhatEverGreen entre otras?
      Y tu archivo config.plist, por aquí no podrás salvo que crees un enlace al sitio en el que está el archivo en Internet pero puedes subirlo a Google Drive, Mega o cualquier otro almacenamiento del que yo lo pueda coger.

  2. Ya, bueno, me ha gustado encontrar esta página íntegra en español y sobre todo tu amabilidad para responder, hay mucha gente que ni responde, te mando por email si quieres mi carpeta EFI. Estoy usando la última versión de OpenCore, la 0.62, y los kexts los bajé los más actualizados, no sé si eso será un error.

    1. Buenos días, Rubén, este texto es para hablar de NVRAM. Tu placa por antigüedad no puede tener NVRAM nativa, eso ya lo sabes. Pero puedes intentar NVRAM emulada. Como parece que ahora estás con OpenCore (OC), te comento sobre este bootloader aunque casi todo lo tienes estudiado ya. Estas son las instrucciones de los autores de OC para casos como el tuyo, pienso que las has seguido ya pero es lo que hay, no tenemos otras instrucciones mejores o diferentes. Por supuesto en tu caso SSDT-PMC.aml no tiene utilidad.

      1. Quitar rastros de Clover

      Como has tenido Clover anteriormente, conviene quitar todo rastro de sus scripts porque pueden interferir con OC, para ello has de borrar

      • /Volumes/EFI/EFI/CLOVER/drivers64UEFI/EmuVariableUefi-64.efi
      • /Volumes/EFI/nvram.plist
      • /etc/rc.clover.lib
      • /etc/rc.boot.d/10.save_and_rotate_boot_log.local
      • /etc/rc.boot.d/20.mount_ESP.local
      • /etc/rc.boot.d/70.disable_sleep_proxy_client.local.disabled
      • /etc/rc.shutdown.d/80.save_nvram_plist.local
      • /etc/rc.boot.d
      • /etc/rc.shutdown.d

      Algunas carpetas pueden estar vacías y algunos archivos pueden no existir.

      2. Config.plist

      Booter: DisableVariableWrite NO
      Misc > Security: ExposeSensitiveData 0x3
      NVRAM: LegacyEnable: YES / LegacyOverwrite: YES / LegacySchema: tiene que estar relleno con las variables NVRAM, aquí puedes dejarlo tal como lo tiene OC por defecto, lo que quiere decir este apartado es que LegacySchema no puede estar vacía / WriteFlash: YES.

      3. Carpeta EFI

      El driver OpenRuntime.efi ha de estar presente y cargarse en el arranque.

      4. LogoutHook.command

      Coloca el archivo LogoutHook.command (/Utilities/LogoutHook) en un sitio desde el que puedas ejecutarlo, puede ser tu carpeta de usuario:
      /Users/(user)/LogoutHook/LogoutHook.command

      Ejecuta este comando en Terminal:
      sudo defaults write com.apple.loginwindow LogoutHook /Users/(user)/LogoutHook/LogoutHook.command

      En teoría con ello has configurado este archivo para que se ejecute cada vez que apagas el PC o sales de la sesión y en ese momento guarda las variables NVRAM en el archivo nvram.plist.

      5. Probar NVRAM

      Pero ten en cuenta una cosa, y esto tiene que ver con el test que haces sudo nvram pepe=pepe.
      Al arrancar, OC lee las variables que hay en nvram.plist (solamente las lee). Al apagar las escribe (solamente al apagar). Pero tú haces el test en medio de ambos instantes, por lo que no va a quedar guardado para el siguiente arranque. Para que el test funcionase, habría que escribir esa variable justo en el momento en que se ejecuta LogoutHook.command porque es el único momento en que macOS escribe en nvram.plist cuando se utiliza este método de NVRAM emulada.

      Como dicen los autores de OC, textualmente, «Something else to note is that macOS is only able to read nvram.plist but it won’t be able to write to nvram.plist unless running the shutdown process. This means running the test won’t work«.

      Así que no te fijes en el test porque en tu caso es normal que no funcione.

      6. nvram -c

      Cuando ejecutas este comando con sudo, algunas variables se borran pero hay algunas que macOS se resiste a borrar incluso aunque la ejecutes aparentemente con permisos: el nombre del ordenador y el valor de csr-active-config, estas suelen permanecer y es normal ese mensaje relativo a los permisos.

      Estoy seguro de que estas instrucciones ya las has seguido pero es que no hay otras. La manera que tienes de saber si la NVRAM está bien emulada es haciendo algún cambio y ver si se guarda, por ejemplo pones config.plist para arrancar en modo verbose, arrancas, le quitas el modo -v y, si la siguiente vez arranca en modo gráfico, es que guarda la variable.

      Saludos, Emilio.

Deja una respuesta

(La dirección de email no es necesaria)