Obtendo a versão do Windows na BIOS/EFI
Uma BIOS/EFI com suporte a ACPI pode requisitar informação sobre qual sistema operacional está executando e, se for o caso, bloquear tentativa de acesso a recursos.
Isso pode ser conveniente quando o fabricante não implementa funcionalidades e deseja lançar o produto rapidamente no mercado.
Neste caso, a BIOS espera que apenas algumas versões de algum sistema operacional(Windows?) esteja instalado. Isso é muito comum em notebooks e vamos ver como descobrir qual sistema operacional nossa BIOS(EFI) espera encontrar.
Para isso vou acessar as tabelas ACPI da BIOS/EFI. Elas fornecema interface entre o sistema operacional e o firmware do sistema.
A tabela que eu quero é a DSDT. Essa é a tabela principal na parte ACPI do BIOS(EFI) e define a maioria dos dispositivos do sistema.
Por padrão, o bootloader transfere as tabelas OEM (de fabricante) do BIOS(EFI) para o sistema operacional. No caso do linux, a tabela estará no subsistema firmware, mas especificamente em /sys/firmware/acpi/tables/DSDT
Esse arquivo está no formato binário, mas usando o comando strings (que exibe os caracteres - texto - dentro do arquivo), podemos extrair o que queremos.
É bom lembrar também que esse arquivo é de propriedade do usuário root e que não teremos permissão de leitura como usuário normal, sendo necessário usar sudo (ou acessar o terminal como root se a distribuição não disponibilizar esse comando).
Sendo assim, para qual versão do sistema operacional Windows meu laptop foi feito para funcionar?
leandro@leandro:~$ sudo strings /sys/firmware/acpi/tables/DSDT | grep -i windows
Windows 2012
Windows 2001
Windows 2001 SP1
Windows 2001 SP2
Windows 2001.1
Windows 2006
Windows 2009
Windows 2012
Pegamos a versão mais recente que aparecer na listagem - Windows 2012 - assim eu espero que meu laptop seja compatível no máximo com Windows 8 e Windows Server 2012!
A listagem de compatibilidade pode ser encontrada aqui
Em sistemas operacionais que não estejam na lista, pode ser que a BIOS desabilite algum recurso.
No caso do Linux, podemos indicar ao firmware durante o boot para personalizar um sistema windows compatível passando o parâmetro acpi_osi para o kernel. Para isso obtemos a versão Windows e passamos algo como:
acpi_osi='Windows 2012’
ou
acpi_osi=! acpi_osi='Windows 2012’
Assim estamos informando ao BIOS/ACPI que nosso sistema é um Windows 8 ou Windos Server 2012.
Podemos fazer isso no menu do grub durante o boot ou configurar de forma permanente no sistema operacional no arquivo /etc/default/grub
Em algumas máquinas (não todas e nem foi o meu caso) esse truque elimina algumas mensagens de erro relacionandos a ACPI durante o boot e que podem ser consultadas posteriormente com o comando dmesg.
Se a versão mais recente não funcionar, você pode testar as anteriores e talvez alguma funcione.