roisoft
New member
Guía DSDT-OSX86 - Inyección de Video (gráficas Nvidia)
Inyección de codigo via DSDT para gráficas NVIDIA
En esta tercera guía, abordaremos como añadir a nuestro DSDT, código para inyección de gráficos que posibilitará que dejemos de utilizar cadenas Efi o inyectores de video para tarjetas Nvidia.
*nota: Hemos tenido éxito con esta técnica para algunas GMA950, X3100 y en algunas ATI de las serie x1xxx pero todavía no en las HD.
Herramientas necesarias:
Ioregistry explorer
Tarjeta gráfica Nvidia funcionando 100% incluidas las salidas de video necesarias (QE y CI por hardware).
Haber leído previamente el capítulo uno y dos de la guía
Contenido:
1. Como reconocer donde está nuestra tarjeta de video en el registro y sus devices asociados.
2. Descompilación del archivo DSDT.aml y añadido de cófigo gráfico.
2a. El código cargador.
3. Comparación de nuestro Ioreg con el código añadido, Nvcaps, reg y renombrado.
4. Estructura básica de dispositivos de video en el DSDT y añadido de nuestro código.
4a. Ejemplo con portatil.
4b. Ejemplo con ordenador tipo torre.
5. Compilación y prueba.
1. Como reconocer donde está nuestra tarjeta de video en el registro y sus devices asociados.
Una vez descargado el programa Ioregistry explorer, procedemos ejecutarlo, nos desplazaremos por el arbol de entradas hasta que encontremos la referencia de nuestra tarjeta de video, normalmente suele ser bastante claro:
Este ejemplo es de un portátil con una tarjeta Nvidia 8600GT 256 MB usando los últimos parches de video y Nvinject como inyector.
Como vereis, no está marcada en verde la linea que corresponde a la tarjeta, sino la superior, y tiene su explicación: en el código DSDT no la encontraremos con su nombre, sino con la del dispositivo que la alberga.
Vamos a explicar un poco estos dispositivos:
Marcado en rojo está el dispositivo AGP@1, que depende de PCI@0, este dispositivo alberga un sub-dispositívo denominado VID@0, en el cual se halla nuestra tarjeta de video.
A su vez, el dispositivo VID@0 contiene otros dispositivos que no vemos, como LCD, VGA, etc.....
2. Descompilación del dsdt.aml y añadido del código gráfico.
Asumiendo que previamente a esta guía habeis conseguido tener un dsdt fijado y operativo (Hpet y RTC parcheados etc...) hacemos una copia de seguridad del archivo DSDT.aml y nos disponemos a trabajar sobre el.
En las anteriores guías ya hemos hablado del binaio llamado "iasl" que se encuentra dentro de la carpeta "toolt" del patcher creado por fassl. Repito la recomendación de que copieis este archivo en /usr/bin con esto lo tendremos siempre disponible al abrir el terminal y no tendremos que estar recordadndo donde lo hemos puesto o arrastrarlo al terminal cada vez que queremos modificar nuestro archivo dst.dsl
Dicho esto, y habiendo copiado el binario en donde hemos mencionado comenzamos con la descompilación del DSDT.aml:
Abrimos terminal, nos logueamos como root y accedemos a la carpeta en donde tenemos alamacenado el dsdt (cd "ruta a la carpeta")
una vez dentro tecleamos "iasl -d dsdt.aml"
Esto creará el archivo DSDT.dsl, hacemos una copia del mismo para tenerla como respaldo y la movemos fuera de la carpeta tools para no tener superpoblación de archivos.
Ahora ya prodemos editar el DSDT.dsl usando un editor de texto de nuestra elección (se sugiere textmate)
Para este ejemplo utilizaremos un dsdt de un equipo portátil.
Nota: El código marcado en rojo no es utilizado.
El color azul reseña la parte del código que debemos adaptar a nuestra tarjeta de video.
Renombrado de nuestra tarjeta en el código foraneo.
Si os fijáis en las letras en azul que se sugiere, veréis que están marcadas el Buffer y el nombre de la tarjeta, ¿porque?, pues es simple, deberéis de cambiar el nombre de la tarjeta por el vuestro, y el buffer lo que indica es el número de caracteres (incluyendo los espacios) que hay en el nombre entrecomillado+1, si cambiáis el nombre, pero no el buffer, la compilación fallará.
Como averiguar el buffer (que ademas está en hexadecimal).
Es bien sencillo, necesitamos un conversor decimal a hexadecimal y al contrario.
Una web que os puede venir muy conveniente es esta:
o esta:
Bien, empezemos:
Ejemplo de buffer para la línea "Nvidia GeForce 8600M GS 256 MB" , el número de letras y espacios contenidos aqui es 30 (decimal), añadimos 1 al resultado (realmente lo que pasa es que la cuenta numérica empieza desde cero), lo que nos da 31, usando las webs arriba indicadas, ponemos 31 en decimal y nos dá como resultado 1F en hexadecimal, es decir, el buffer empleado.
Si cambiamos el nombre al de nuestra tarjeta, deberemos de usar este mismo planteamiento para calcular el tamaño del buffer.
2a. El código cargador.
Daremos un repaso al concepto de código cargador del que ya hemos hablado en la anterior guía.
Nuestro código no es ACPI, es una cadena de información que añadiremos al código ACPI, y si la ponemos tal cual, nuestro registro OSX no la cargará al no ser esta compatible ACPI, para que esta sea cargada, tendremos que utilizar un "cargador", que no es mas que un poco de código que definirá nuestra entrada de código y permitirá su carga por parte del sistema.
Donde insertar el "cargador"?
Esto es sencillo, debéis de buscar con el editor de texto una zona del código que se llama _WAK, y cuando termina la definición de la misma, encajar el código cargador.
Codigo cargador:
El código de esta zona dependerá de la máquina, y basicaménte tenéis que buscar el final del código _WAK, que terminará así:
He incluir debajo el codigo cargador.
EJEMPLO:
Zona de carga mas cargador:
Abrimos el terminal, nos logueamos como root y accedemos a la carpeta del dsdt (cd "ruta a la carpeta") seguidamente tecleamos
iasl -f dsdt.dsl
Si se producen errores, es que habéis puesto mal el cargador, si ocurren warnings, es que es posible que vengan de antes, no les hagáis mucho caso ahora.
Si no se producen errores, borrad el archivo DSDT.aml que se ha generado y proseguimos el trabajo dentro de DSDT.dsl
3. Comparación de nuestro Ioreg con el código añadido, Nvcaps, reg y renombrado.
Ahora procederemos a buscar los datos necesarios en nuestro IOREG para insertarlos en cada parte correspondiente en el código.
Buscaremos primero las NVCAP o configuración de las salidas de nuestra tarjeta de video y el NVPM o gestión de energia.
Abrimos el IOREG y buscamos nuestra tarjeta de video, señalando el dispositivo hijo y buscaremos la entrada NVCAP y la NVPM:
Una vez tengamos los valores NVCAP y NVPM, los rectificaremos en nuestro código.
Ahora miremos el valor de la entrada REG:
Modificaremos el valor de REG en el código gráfico, para que tenga el valor real que tiene en nuestro sistema.
4. Estructura básica de dispositivos de video en el DSDT y añadido de nuestro código.
4a. Ejemplo utilizando un portátil.
Abramos el DSDT.dsl y busquemos mediante la palabra clave "device" hasta que lleguemos a:
Device (AGP)
Encontraremos el árbol de dispositivos de esta manera (diferentes colores para cada dispositivo):
Resumidamente sin nuestro código:
Resumidamente CON nuestro código:
Extendido:
4b. Ejemplo utilizando un ordenador tipo torre.
Buscaremos con el IOregistry explorer nuestra tarjeta de video, y aquí notaremos una diferencia con respecto al código en el ordenador portátil, y es la siguiente:
En el ordenador tipo torre, no encontraremos los devices de video que vimos en el ejemplo anterior, LCD, CRT etc, salvo en los casos de gráfica integrada, tendremos que buscar en el ioreg el emplazamiento de nuestra gráfica, normalmente suele estar bajo algunos de los dispositivos PCI como por ejemplo PC1, P0P1 etc.. depende del fabricante de la placa, pero algunas veces no vemos el dispositivo con una demarcación clara en el ioreg y nos aparece como PCI2BRIDGE o PCIBRIDGE en este caso añadiremos la entrada directamente en el PCI ya que todos estos dispositivos tienen como dispositivo "madre" al PCI principal ..... En placas con gráfica integrada podemos encontrarnos algo más parecido al ejemplo del ordenador portátil, pero no deberemos de caer en errores, el código deberá ser añadido en el código correspondiente al dispositivo en el que se encuentra emplazada nuestra tarjeta y no en la parte del video integrado de la placa.
Fijáros en el código del puerto PCI.
Aquí tendríamos nuestro código de video añadido al puerto PCI:
5. Compilación y prueba.
Ahora solo nos quedará salvar el archivo y compilarlo para ver si tiene errores de sintaxis o no.
Abrimos el terminal, nos logueamos como root y accedemos a la carpeta en donde tenemos nuestro dsdt (cd "ruta a la carpeta") tecleamos
iasl dsdt.dsl
Si se producen errores, es que habéis puesto mal el cargador, si ocurren warnings, es que es posible que vengan de antes, no les hagáis mucho caso ahora.
Si los tiene, aseguraos de que no hayan quedado corchetes huérfanos o borrados.
Si no los tiene, renombrad el archivo DSDT.aml que tenéis en el root del sistema a "DSDTold.aml" y copiad el nuevo (que se abra creado al compilar) en la raíz del disco.
Borramos el inyector que estemos utilizando (Nvkush,Nvinject ó NVdarwin) o la cadena EFI si es que usamos éste método y procedemos a reinicíar. Si nuestro emplazamiento ha sido el correcto y la codificación adecuada nuestra gráfica deberia de estar perfectamente reconocidad y con todo activado.
Si fallase el nuevo DSDT.aml, (por ejemplo se congela el sistema), podéis arrancar el sistema utilizando el comando DSDT=DSDTold.aml (introducidlo cuando veáis el arranque chameleon presionando F8 y seleccionando la instalación de Leopard).
Esperamos que esta tercera guía sobre las posibilidades del sistema DSDT haya sido de vuestro agrado.
Estaremos actualizando las guias a medida que tengamos nuevos datos....
Inyección de codigo via DSDT para gráficas NVIDIA
En esta tercera guía, abordaremos como añadir a nuestro DSDT, código para inyección de gráficos que posibilitará que dejemos de utilizar cadenas Efi o inyectores de video para tarjetas Nvidia.
*nota: Hemos tenido éxito con esta técnica para algunas GMA950, X3100 y en algunas ATI de las serie x1xxx pero todavía no en las HD.
Herramientas necesarias:
Ioregistry explorer
Tarjeta gráfica Nvidia funcionando 100% incluidas las salidas de video necesarias (QE y CI por hardware).
Haber leído previamente el capítulo uno y dos de la guía
Contenido:
1. Como reconocer donde está nuestra tarjeta de video en el registro y sus devices asociados.
2. Descompilación del archivo DSDT.aml y añadido de cófigo gráfico.
2a. El código cargador.
3. Comparación de nuestro Ioreg con el código añadido, Nvcaps, reg y renombrado.
4. Estructura básica de dispositivos de video en el DSDT y añadido de nuestro código.
4a. Ejemplo con portatil.
4b. Ejemplo con ordenador tipo torre.
5. Compilación y prueba.
1. Como reconocer donde está nuestra tarjeta de video en el registro y sus devices asociados.
Una vez descargado el programa Ioregistry explorer, procedemos ejecutarlo, nos desplazaremos por el arbol de entradas hasta que encontremos la referencia de nuestra tarjeta de video, normalmente suele ser bastante claro:
Este ejemplo es de un portátil con una tarjeta Nvidia 8600GT 256 MB usando los últimos parches de video y Nvinject como inyector.
Como vereis, no está marcada en verde la linea que corresponde a la tarjeta, sino la superior, y tiene su explicación: en el código DSDT no la encontraremos con su nombre, sino con la del dispositivo que la alberga.
Vamos a explicar un poco estos dispositivos:
Marcado en rojo está el dispositivo AGP@1, que depende de PCI@0, este dispositivo alberga un sub-dispositívo denominado VID@0, en el cual se halla nuestra tarjeta de video.
A su vez, el dispositivo VID@0 contiene otros dispositivos que no vemos, como LCD, VGA, etc.....
2. Descompilación del dsdt.aml y añadido del código gráfico.
Asumiendo que previamente a esta guía habeis conseguido tener un dsdt fijado y operativo (Hpet y RTC parcheados etc...) hacemos una copia de seguridad del archivo DSDT.aml y nos disponemos a trabajar sobre el.
En las anteriores guías ya hemos hablado del binaio llamado "iasl" que se encuentra dentro de la carpeta "toolt" del patcher creado por fassl. Repito la recomendación de que copieis este archivo en /usr/bin con esto lo tendremos siempre disponible al abrir el terminal y no tendremos que estar recordadndo donde lo hemos puesto o arrastrarlo al terminal cada vez que queremos modificar nuestro archivo dst.dsl
Dicho esto, y habiendo copiado el binario en donde hemos mencionado comenzamos con la descompilación del DSDT.aml:
Abrimos terminal, nos logueamos como root y accedemos a la carpeta en donde tenemos alamacenado el dsdt (cd "ruta a la carpeta")
una vez dentro tecleamos "iasl -d dsdt.aml"
Esto creará el archivo DSDT.dsl, hacemos una copia del mismo para tenerla como respaldo y la movemos fuera de la carpeta tools para no tener superpoblación de archivos.
Ahora ya prodemos editar el DSDT.dsl usando un editor de texto de nuestra elección (se sugiere textmate)
Para este ejemplo utilizaremos un dsdt de un equipo portátil.
Nota: El código marcado en rojo no es utilizado.
El color azul reseña la parte del código que debemos adaptar a nuestra tarjeta de video.
Renombrado de nuestra tarjeta en el código foraneo.
Si os fijáis en las letras en azul que se sugiere, veréis que están marcadas el Buffer y el nombre de la tarjeta, ¿porque?, pues es simple, deberéis de cambiar el nombre de la tarjeta por el vuestro, y el buffer lo que indica es el número de caracteres (incluyendo los espacios) que hay en el nombre entrecomillado+1, si cambiáis el nombre, pero no el buffer, la compilación fallará.
Como averiguar el buffer (que ademas está en hexadecimal).
Es bien sencillo, necesitamos un conversor decimal a hexadecimal y al contrario.
Una web que os puede venir muy conveniente es esta:
Entrar
or
Registrarse
para completar la lectura
o esta:
Entrar
or
Registrarse
para completar la lectura
Bien, empezemos:
Ejemplo de buffer para la línea "Nvidia GeForce 8600M GS 256 MB" , el número de letras y espacios contenidos aqui es 30 (decimal), añadimos 1 al resultado (realmente lo que pasa es que la cuenta numérica empieza desde cero), lo que nos da 31, usando las webs arriba indicadas, ponemos 31 en decimal y nos dá como resultado 1F en hexadecimal, es decir, el buffer empleado.
Si cambiamos el nombre al de nuestra tarjeta, deberemos de usar este mismo planteamiento para calcular el tamaño del buffer.
2a. El código cargador.
Daremos un repaso al concepto de código cargador del que ya hemos hablado en la anterior guía.
Nuestro código no es ACPI, es una cadena de información que añadiremos al código ACPI, y si la ponemos tal cual, nuestro registro OSX no la cargará al no ser esta compatible ACPI, para que esta sea cargada, tendremos que utilizar un "cargador", que no es mas que un poco de código que definirá nuestra entrada de código y permitirá su carga por parte del sistema.
Donde insertar el "cargador"?
Esto es sencillo, debéis de buscar con el editor de texto una zona del código que se llama _WAK, y cuando termina la definición de la misma, encajar el código cargador.
Codigo cargador:
Zona de carga:Method (DTGP, 5, NotSerialized)
{
If (LEqual (Arg0, Buffer (0x10)
{
/* 0000 */ 0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,
/* 0008 */ 0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B
}))
{
If (LEqual (Arg1, One))
{
If (LEqual (Arg2, Zero))
{
Store (Buffer (One)
{
0x03
}, Arg4)
Return (One)
}
If (LEqual (Arg2, One))
{
Return (One)
}
}
}
Store (Buffer (One)
{
0x00
}, Arg4)
Return (Zero)
}
El código de esta zona dependerá de la máquina, y basicaménte tenéis que buscar el final del código _WAK, que terminará así:
o en algunas placas tb puede serReturn (Package (0x02)
{
Zero,
Zero
})
}
Return (WAKP)
}
He incluir debajo el codigo cargador.
EJEMPLO:
Zona de carga mas cargador:
Salváis el archivo y lo compilamos para ver si se han producido errores en el código.Method (_WAK, 1, NotSerialized)
{
P8XH (One, 0xAB)
If (LOr (LEqual (Arg0, 0x03), LEqual (Arg0, 0x04)))
{
If (And (CFGD, 0x01000000))
{
If (LAnd (And (CFGD, 0xF0), LEqual (OSYS, 0x07D1)))
{
TRAP (0x3D)
}
}
}
If (LEqual (RP2D, Zero))
{
Notify (\_SB.PCI0.RP02, Zero)
}
If (LEqual (Arg0, 0x03)) {}
If (LEqual (Arg0, 0x04))
{
\_SB.PCI0.LPCB.EC0.SELE ()
}
P8XH (Zero, 0xCD)
Return (Package (0x02)
{
Zero,
Zero
})
}
Method (DTGP, 5, NotSerialized)
{
If (LEqual (Arg0, Buffer (0x10)
{
/* 0000 */ 0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,
/* 0008 */ 0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B
}))
{
If (LEqual (Arg1, One))
{
If (LEqual (Arg2, Zero))
{
Store (Buffer (One)
{
0x03
}, Arg4)
Return (One)
}
If (LEqual (Arg2, One))
{
Return (One)
}
}
}
Store (Buffer (One)
{
0x00
}, Arg4)
Return (Zero)
}
Abrimos el terminal, nos logueamos como root y accedemos a la carpeta del dsdt (cd "ruta a la carpeta") seguidamente tecleamos
iasl -f dsdt.dsl
Si se producen errores, es que habéis puesto mal el cargador, si ocurren warnings, es que es posible que vengan de antes, no les hagáis mucho caso ahora.
Si no se producen errores, borrad el archivo DSDT.aml que se ha generado y proseguimos el trabajo dentro de DSDT.dsl
3. Comparación de nuestro Ioreg con el código añadido, Nvcaps, reg y renombrado.
Ahora procederemos a buscar los datos necesarios en nuestro IOREG para insertarlos en cada parte correspondiente en el código.
Buscaremos primero las NVCAP o configuración de las salidas de nuestra tarjeta de video y el NVPM o gestión de energia.
Abrimos el IOREG y buscamos nuestra tarjeta de video, señalando el dispositivo hijo y buscaremos la entrada NVCAP y la NVPM:
Una vez tengamos los valores NVCAP y NVPM, los rectificaremos en nuestro código.
Ahora miremos el valor de la entrada REG:
Modificaremos el valor de REG en el código gráfico, para que tenga el valor real que tiene en nuestro sistema.
4. Estructura básica de dispositivos de video en el DSDT y añadido de nuestro código.
4a. Ejemplo utilizando un portátil.
Abramos el DSDT.dsl y busquemos mediante la palabra clave "device" hasta que lleguemos a:
Device (AGP)
Encontraremos el árbol de dispositivos de esta manera (diferentes colores para cada dispositivo):
Resumidamente sin nuestro código:
Resumidamente CON nuestro código:
Extendido:
4b. Ejemplo utilizando un ordenador tipo torre.
Buscaremos con el IOregistry explorer nuestra tarjeta de video, y aquí notaremos una diferencia con respecto al código en el ordenador portátil, y es la siguiente:
En el ordenador tipo torre, no encontraremos los devices de video que vimos en el ejemplo anterior, LCD, CRT etc, salvo en los casos de gráfica integrada, tendremos que buscar en el ioreg el emplazamiento de nuestra gráfica, normalmente suele estar bajo algunos de los dispositivos PCI como por ejemplo PC1, P0P1 etc.. depende del fabricante de la placa, pero algunas veces no vemos el dispositivo con una demarcación clara en el ioreg y nos aparece como PCI2BRIDGE o PCIBRIDGE en este caso añadiremos la entrada directamente en el PCI ya que todos estos dispositivos tienen como dispositivo "madre" al PCI principal ..... En placas con gráfica integrada podemos encontrarnos algo más parecido al ejemplo del ordenador portátil, pero no deberemos de caer en errores, el código deberá ser añadido en el código correspondiente al dispositivo en el que se encuentra emplazada nuestra tarjeta y no en la parte del video integrado de la placa.
Fijáros en el código del puerto PCI.
El código continua mucho más, pero tomaremos esto como referencia.Device (PCI0)
{
Name (_HID, EisaId ("PNP0A03"))
Name (_ADR, 0x00)
Name (_UID, 0x01)
Name (_BBN, 0x00)
Method (_S3D, 0, NotSerialized)
{
If (LEqual (OSFL, 0x02))
{
Return (0x02)
}
Else
{
Return (0x03)
}
}
Method (_STA, 0, NotSerialized)
{
Return (0x0F)
}
Method (_CRS, 0, NotSerialized)
{
Name (BUF0, ResourceTemplate ()
{
Aquí tendríamos nuestro código de video añadido al puerto PCI:
5. Compilación y prueba.
Ahora solo nos quedará salvar el archivo y compilarlo para ver si tiene errores de sintaxis o no.
Abrimos el terminal, nos logueamos como root y accedemos a la carpeta en donde tenemos nuestro dsdt (cd "ruta a la carpeta") tecleamos
iasl dsdt.dsl
Si se producen errores, es que habéis puesto mal el cargador, si ocurren warnings, es que es posible que vengan de antes, no les hagáis mucho caso ahora.
Si los tiene, aseguraos de que no hayan quedado corchetes huérfanos o borrados.
Si no los tiene, renombrad el archivo DSDT.aml que tenéis en el root del sistema a "DSDTold.aml" y copiad el nuevo (que se abra creado al compilar) en la raíz del disco.
Borramos el inyector que estemos utilizando (Nvkush,Nvinject ó NVdarwin) o la cadena EFI si es que usamos éste método y procedemos a reinicíar. Si nuestro emplazamiento ha sido el correcto y la codificación adecuada nuestra gráfica deberia de estar perfectamente reconocidad y con todo activado.
Si fallase el nuevo DSDT.aml, (por ejemplo se congela el sistema), podéis arrancar el sistema utilizando el comando DSDT=DSDTold.aml (introducidlo cuando veáis el arranque chameleon presionando F8 y seleccionando la instalación de Leopard).
Esperamos que esta tercera guía sobre las posibilidades del sistema DSDT haya sido de vuestro agrado.
Estaremos actualizando las guias a medida que tengamos nuevos datos....