La Guia DSDT II TM Fix
La Guia DSDT II TM Fix
La Guia DSDT II TM Fix
En esta segunda gua, abordaremos como solucionar el problema que algunos usuarios tienen con los backups con Time machine, debido a que el sistema no reconoce la tarjeta de red como dispositivo EN0, para lo cual existe la solucin de aadir una cadena EFI al archivo com.apple.boot.plist, pero para los mas "inquietos", os ofreceremos como realizarlo en el DSDT, teniendo asi siempre limpio nuestro com.apple.boot.plist, y de paso, introduciendo la tcnica de edicin de DSDT para nuestro prximo captulo (Edicin de DSDT para injectar dispositivos de video).
Contenido: 1. Como reconocer donde est nuestra tarjeta de red en el registro. 2. Descompilacin del archivo DSDT.aml. 3. Estructura bsica de dispositivos en el DSDT 4. Localizacin de nuestra tarjeta de red en el archivo DSDT. 5. Inclusin del codigo.
5a. Anadido del cdigo que arregla el problema Time machine.
6. Compilacin y prueba.
Como vereis, no est marcada en verde la linea que corresponde a la tarjeta, sino la superior, y tiene su explicacin: en el cdigo 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 RP03, este dispositivo alberga un sub-dispositvo denominado PXS3, en el cual se halla nuestra tarjeta de red. A su vez, el dispositivo RP03 es un sub-dispositvo del cdigo correspondiente a los puertos Pci (PCI0) Cuando aadamos nuestro cdigo, tendremos que estar seguros que es dentro de PXS3 y que cerramos convenientemente el cdigo para no producir errores en la compilacin (se ver mas adelante), si os equivocis y el cdigo cae fuera de PXS3, es muy posible que quede hurfano como dispositvo PCI y que osx no sepa que hacer con el al no estar correctamente denido. Procedamos ahora a descompilr nuestro DSDT.aml previamente creado.
Mover una copia del archivo DSDT.aml dentro de la carpeta "tools" (que se halla dentro de la carpeta del parcher), estar seguros que se llama DSDT.aml. Dentro de la carpeta "tools" encontraremos un binario llamado "iasl" bien mi recomendacin es 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 modicar nuestro archivo dst.dsl Dicho esto, y habiendo copiado el binario en donde hemos mencionado comenzamos con la descompilacin 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 superpoblacin de archivos. Ahora ya prodemos editar l DSDT.dsl usando un editor de texto de nuestra eleccin (se sugiere textmate)
Device (RP03)
{
Name (_ADR, 0x001C0002) OperationRegion (P3CS, PCI_Cong, 0x40, 0x0100) Field (P3CS, AnyAcc, NoLock, WriteAsZeros)
{
Offset (0x10), L0C3, 1, L1C3, 1, Offset (0x12), , 13, LAS3, 1, Offset (0x1A), ABP3, 1, , 2, PDC3, 1, , 2, PDS3, 1, Offset (0x1B), LSC3, 1, Offset (0x20), Offset (0x22), PSP3, 1, Offset (0x9C), , 30, HPS3, 1, PMS3, 1
Device (PXS3)
{
Name (_ADR, Zero) Name (_PRW, Package (0x02) { 0x09, 0x03 })
}
Method (_PRT, 0, NotSerialized)
{
If (GPIC) { Return (Package (0x04) { Package (0x04) { 0xFFFF, Zero, Zero, 0x12 }, Package (0x04) { 0xFFFF, One, Zero, 0x13 }, Package (0x04) { 0xFFFF, 0x02, Zero, 0x10 },
}
Device (USB1)
{ Name (_ADR, 0x001D0000) OperationRegion (U1CS, PCI_Cong, 0xC4, 0x04) Field (U1CS, DWordAcc, NoLock, Preserve) { U1EN, 2 } Name (_PRW, Package (0x02) { 0x03, 0x03 }) Method (_PSW, 1, NotSerialized) { If (Arg0) { Store (0x03, U1EN) } Else { Store (Zero, U1EN) } } Method (_S3D, 0, NotSerialized) { Return (0x02) } Method (_S4D, 0, NotSerialized) { Return (0x02) } }
Una vez encontrado nuestro dispositivo de red en el Ioregistry explorer (o el que utilicis vosotros) abrid el archivo DSDT.dsl con el editor de texto, abrid el men "buscar" y ponis el nombre del dispositivo en el campo "bsqueda", en este caso es PXS3, buscadlo hasta que la entrada que aparezca sea del tipo: Device (PXS3) (o el que os corresponda a vosotros)
Codigo cargador:
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) }
Zona de carga:
El cdigo de esta zona depender de la mquina, y basicamnte tenis que buscar el nal del cdigo _WAK, que terminar as: Return (Package (0x02) { Zero, Zero }) }
iasl -f dsdt.dsl Si se producen errores, es que habis puesto mal el cargador, si ocurren warnings, es que es posible que vengan de antes, no les hagis mucho caso ahora. Si no se producen errores, borrad el archivo DSDT.aml que se a generado y proseguimos el trabajo dentro de DSDT.dsl
{
Name (_ADR, 0x001C0002) OperationRegion (P3CS, PCI_Cong, 0x40, 0x0100) Field (P3CS, AnyAcc, NoLock, WriteAsZeros)
{
Offset (0x10), L0C3, 1, L1C3, 1, Offset (0x12), , 13, LAS3, 1, Offset (0x1A), ABP3, 1, , 2, PDC3, 1, , 2, PDS3, 1, Offset (0x1B), LSC3, 1, Offset (0x20), Offset (0x22), PSP3, 1, Offset (0x9C), , 30, HPS3, 1, PMS3, 1
Device (PXS3)
{
Name (_ADR, Zero) Name (_PRW, Package (0x02) { 0x09, 0x03 })
}
Method (_PRT, 0, NotSerialized)
{
If (GPIC) { Return (Package (0x04) { Package (0x04) { 0xFFFF, Zero, Zero, 0x12 }, Package (0x04) { 0xFFFF, One, Zero, 0x13 }, Package (0x04) { 0xFFFF, 0x02, Zero, 0x10 }, Package (0x04) { 0xFFFF, 0x03, Zero, 0x11 } }) }
}
Device (USB1)
{ Name (_ADR, 0x001D0000) OperationRegion (U1CS, PCI_Cong, 0xC4, 0x04) Field (U1CS, DWordAcc, NoLock, Preserve) { U1EN, 2 } Name (_PRW, Package (0x02) { 0x03, 0x03 }) Method (_PSW, 1, NotSerialized) { If (Arg0) { Store (0x03, U1EN) } Else { Store (Zero, U1EN) } } Method (_S3D, 0, NotSerialized) { Return (0x02) } Method (_S4D, 0, NotSerialized) { Return (0x02) } }
Ahora que estamos en el sitio correcto, hecharmos un vistazo al cdigo que arregla el problema: Method (_DSM, 4, NotSerialized) {
Store (Package (0x06) { "built-in", Buffer (One) { 0x01 }, "device_type", Buffer (0x09) { "ethernet" }, "name", Buffer (0x24) { "Realtek RTL8111/8168B PCI-E Gigabit" } }, Local0) DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) }
Si os jis en las letras en rojo que se sugiere, veris que estn marcadas el Buffer y el nombre de la tarjeta, porque?, pues es simple, deberis de cambiar el nombre de la tarjeta por el vuestro, y el buffer lo que indica es el nmero de caracteres (incluyendo los espacios) que hay en el nombre entrecomillado+1, si cambiis el nombre, pero no el buffer, la compilacin 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: http://www.parkenet.com/apl/HexDecConverter.html o esta: http://www.paulschou.com/tools/xlate/ Bien, empezemos: *nota : Es necesario decir que la lnea "Realtek RTL8111/8168B PCI-E Gigabit" no es necesaria para jar TM lo hemos puesto porque nos sirve de ejemplo para que entendamos como se calcula el buffer (explicado a continuacin), adems nos servir de informacin y localizacin en el ioreg y tb por que no decirlo, queda ciertamente profesional :)
"Realtek RTL8111/8168B PCI-E Gigabit" , el nmero de letras y espacios contenidos aqui es 35 (decimal), por seguridad, aadimos 1, lo que nos da 36, usando las webs arriba indicadas, ponemos 36 en decimal y nos d como resultado 24 en hexadecimal, osea, el buffer empleado. Buffer (0x24) Ahora cambiaremos el nombre que viene en el cdigo que arregla el TM, poniendo en este caso el que le corresponde: "Realtek RTL8169 PCI-E" Nmero de caracteres y espacios +1 = 22 (decimal) Pasados a hexadecimal en las webs arriba indicadas: 16 Osea, nuestro buffer es: Buffer (0x16) Asi, el cdigo que arregla el TM para esta tarjeta de red, quedaria: Method (_DSM, 4, NotSerialized) { Store (Package (0x06) { "built-in", Buffer (One) { 0x01 }, "device_type", Buffer (0x09) { "ethernet" }, "name", Buffer (0x16) { "Realtek RTL8169 PCI-E" } }, Local0) DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } Lo cual ya es correcto y esta listo para su insercin en el cdigo DSDT. A proposito.... jaros en las ltimas lineas de cdigo:
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) Estas lineas son las que permiten que el cdigo cargador identique que es "nuestro" cdigo y las cargue, si no estuviesen estas lneas, el cdigo cargador no sabra que las tiene que cargar. Insertemos nuestro cdigo ahora que est correcto:
Device (RP03)
{
Name (_ADR, 0x001C0002) OperationRegion (P3CS, PCI_Cong, 0x40, 0x0100) Field (P3CS, AnyAcc, NoLock, WriteAsZeros)
{
Offset (0x10), L0C3, 1, L1C3, 1, Offset (0x12), , 13, LAS3, 1, Offset (0x1A), ABP3, 1, , 2, PDC3, 1, , 2, PDS3, 1, Offset (0x1B), LSC3, 1, Offset (0x20), Offset (0x22), PSP3, 1, Offset (0x9C), , 30, HPS3, 1, PMS3, 1
Device (PXS3)
{
Name (_ADR, Zero) Name (_PRW, Package (0x02) { 0x09, 0x03 })
Method (_DSM, 4, NotSerialized) { Store (Package (0x06) { "built-in", Buffer (One) { 0x01 }, "device_type", Buffer (0x09) { "ethernet" }, "name", Buffer (0x16) { "Realtek RTL8169 PCI-E" } }, Local0) DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) }
}
Method (_PRT, 0, NotSerialized)
{
If (GPIC) { Return (Package (0x04) { Package (0x04) { 0xFFFF, Zero, Zero, 0x12 }, Package (0x04) { 0xFFFF, One, Zero, 0x13 }, Package (0x04) { 0xFFFF, 0x02, Zero, 0x10 }, Package (0x04) { 0xFFFF, 0x03, Zero, 0x11 } }) }
}
Como podris observar, el cdigo est insertado dentro de los corchetes azul celeste, que denen la tarjeta de red, especicando as para OSX los parmetros requeridos para que Time machine funcione correctamente y debajo de:
Name (_ADR, Zero) Name (_PRW, Package (0x02) { 0x09, 0x03 })
6. Compilacin y prueba.
Ahora solo nos quedar salvar el archivo y compilarlo para ver si tiene errores de sintaxis o no. (visto previamente) Si los tiene, aseguraos de que no hayan quedado corchetes hurfanos o borrados. Si no los tiene, renombrad el archivo DSDT.aml que tenis en el root del sistema a "DSDTold.aml" y copiad el nuevo en la raz del disco. Si fallase el nuevo DSDT.aml, (por ejemplo se congela el sistema), podis arrancar el sistema utilizando el comando DSDT=DSDTold.aml (introducidlo cuando veis el arranque chameleon presionando F8 y seleccionando la instalacin de Leopard). Esperamos que os haya sido til este segundo capitulo de la edicin de DSDT. Gua by: Roisoft y Pere