sexta-feira, 25 de fevereiro de 2011

Gerar uma nova tabela DSDT

Algumas pessoas não sabem o significado de DSDT. Acham até que tem a ver com doença sexualmente transmissível. A maioria nem sabe da existência dessa sigla, incluindo profissionais da área de T.I.

Eu, por exemplo, estou há 11 anos na área de informática e só fui ter conhecimento dessa sigla quando comecei a me interessar por linux... e me aprofundei no assunto ao tentar fazer meu primeiro Hackintosh. APROFUNDEI não significa SOU EXPERT, ou BOTO PRA QUEBRAR. Simplesmente passei a procurar um pouco mais acerca do assunto e até arrisquei corrigir o DSDT do meu netbook que, para minha alegria, deu tudo certo.

Segundo o site acpi.sourceforge.net, DSDT significa Differentiated System Description Table, o que no português deve ser algo parecido com Tabela Diferenciada de Descrição de Sistema. Esta tabela contém o Bloco de Definição Diferenciada, que se encarrega de fornecer a informação e configuração a respeito da base do sistema. Essas informações e configurações são sempre inseridas ao ACPI durante o carregamento do Sistema Operacional. Infelizmente, muitos fabricantes e redistribuidores de hardware não são capazes de fornecer essas tabelas de forma adequada, 100% funcionais (nem mesmo são membros da ACPI SIG). Por isso existe a necessidade de PATCHES para essas tabelas, desenvolvidas por nós, simples usuários curiosos e com tempo sobrando, e por desenvolvedores profissionais.

Eu tenho um netbook Samsung Go (N310) que roda perfeitamente qualquer sistema operacional, mas nem tudo são flores. Aparentemente o DSDT original não me atrapalhava, mas como forma de aprendizado corrigi os dois únicos erros do DSDT e as mensagens de erros e incosistências sumiram do processo de boot do Debian =)

EXECUTE OS COMANDOS ABAIXO COMO ROOT

Passo 1 - Instale o ACPI Source Language compiler/decompiler conhecido iasl
aptitude install iasl

Passo 2 - Extraia o dsdt original com o comando  cat /proc/acpi/dsdt > ~/dsdt.dat

Passo 3 - Atraves do comando abaixo você irá "descompilar" o dsdt.dat (aml - binário) para o dsdt.dsl (código fonte)
iasl -d dsdt.dat

Passo 4 - Observando que agora existem DOIS arquivos (dsdt.dat e dsdt.dsl) rode o comando abaixo para recompilar (de código fonte DSL para binário AML) e verificar os possíveis ERROS (Errors) e os AVISOS (Warnings)
iasl -tc dsdt.dsl

Passo 5 - Agora existem QUATRO arquivos: dsdt.dat, dsdt.hex, dsdt.aml e dsdt.dsl e, no meu caso, apareceram DOIS erros (linhas 1375 e 1382) relacionados ao Length.

Intel ACPI Component Architecture
ASL Optimizing Compiler version 20100528 [Jul  2 2010]
Copyright (c) 2000 - 2010 Intel Corporation
Supports ACPI Specification Revision 4.0a

dsdt.dsl  1375:                     0x00000000,         // Length
Error    4122 -                              ^ Invalid combination of Length and Min/Max fixed flags

dsdt.dsl  1382:                     0x00000000,         // Length
Error    4122 -                              ^ Invalid combination of Length and Min/Max fixed flags

ASL Input:  dsdt.dsl - 5184 lines, 169320 bytes, 1819 keywords
Compilation complete. 2 Errors, 0 Warnings, 0 Remarks, 692 Optimizations

Passo 6 - Abra o dsdt.dsl pelo editor de texto de sua preferência e vá até a linha referenciada pelo compilador.

Linha 1375

0x00000000,         // Granularity
0x00000000,         // Range Minimum
0xFEBFFFFF,         // Range Maximum
0x00000000,         // Translation Offset
0x00000000,         // Length
,, _Y0E, AddressRangeMemory, TypeStatic)


Passo 7 - Agora vem a correção: Va no google, e subtraia o Range Maximun pelo Range Minimum + 1, ou seja,

(0xFEBFFFFF - 0x00000000) + 1
O resultado é 0xFEC00000

Pegue o resultado e coloque em Length. Ficará assim:

0x00000000,         // Granularity
0x00000000,         // Range Minimum
0xFEBFFFFF,         // Range Maximum
0x00000000,         // Translation Offset
0xFEC00000,         // Length
,, _Y0E, AddressRangeMemory, TypeStatic)

Passo 8 - Repita o mesmo processo nas outras linhas com erro (no meu caso a 1382) e salve o arquivo. Execute novamente o comando iasl -tc dsdt.dsl

Passo 9 - Se estiver tudo certo, sem avisos de erro (Os WARNINGS não precisam de tanta preocupação dependendo do caso), guarde os arquivos em um diretório seguro,

Passo 10 - Siga para este post para integrar o arquivo dsdt.hex ao kernel.


Fontes:
Follow Me on Twitter