Month: December 2006

Zerando (resetando) a BIOS pela Linha de comando

Hoje precisei remover a senha da BIOS de um computador onde trabalho, porém o computador só tem Linux. Eu sei que no Windows(DOS) basta entrar no programa debug e executar:

o 70 2E
o 71 FF

(Este código funciona na maioria das BIOS, mas algumas placas Intel podem usar outros códigos)

A questão que começou a me desafiar era exatamente como fazer isso no Linux, ora eu poderia escrever um programa em C com 2 linhas de código que enviasse os valores 0x2E e 0xFF para as portas 0x70 e 0x71, mas seria um pouco fora de lógica fazer isso.

Procurei na Internet como fazer isso no Linux, encontrei uma thread muito interessante sobre o assunto [1]. Uma das sugestões era instalar um programa chamado “cmostool” que poderia ler o conteúdo da CMOS e até mesmo recuperar a senha.

Interessante, mas e se o computador não tem acesso à Internet?

Foi então que lembrei da técnica usada para controlar os bits da porta paralela pelo terminal do Linux.
Batata!, funcionou. Então resolvi procurar na Internet para descobrir se alguém já tinha documentado a idéia, mas não encontrei nada a respeito.

O comando fica assim:

# printf “\x2E” | dd bs=1 seek=112 of=/dev/port
# printf “\xFF” | dd bs=1 seek=113 of=/dev/port

O “printf” converte o texto em hexadecimal no byte correspondente e repassa este byte para o comando dd que por sua vez escreve este byte na porta 0x70 (112) e 0x71(113).

[1] – http://lists.samba.org/archive/linux/2001-September/000643.html

Advertisements

Montando um hard disk image

Normalmente programas como o qemu e outros criam um hard disk image, que é exatamente a estrutura de um HD, porém salvo em arquivo.

Se tentamos montar esta imagem como o comando “mount” e a opção “-o loop” apenas, não teremos um resultado positivo, pois a partição não é encontrada, mas sim o inicío do disco, ou seja, o Master Boot Record (MBR) e as tabelas de partições.

O que temos que fazer é pular este início, através do comando:

mount -o loop,offset=32256 winxp.img /mnt/qemu

Ajuda valiosa

Provavelmente alguma vez você já recebeu uma mensagem de erro como essa:

Access Error: FS=8, Physical bus error on operand write
PC: 0001467A SR: 2718 [t.Sm.111…XNzvc]
An: 2000FFC0 F0F97FC0 F0F87F80 00000000 00000000 00020100 2000FFB4 2000FFA8
Dn: 10025FDC 000001A6 F0FDA000 F0F97F90 00000000 00000000 00000000 2000FFC0
0001467A: 4292 CLR.L (A2)

Aparentemente esta mensagem não ajuda muito, não é?
Mas se você utilizar o comando addr2line poderá descobrir exatamente em qual linha o erro ocorreu:

# m68k-elf-addr2line -e u-boot.elf 0x0001467A
/comum/lixo/build/u-boot-1.1.6/lib_m68k/board.c:363

Recuperando o dBug da M5282Lite via BDM

É possível gravar o bootloader dBug da Motorola na placa M5282Lite usando o programador BDM e o programa ProgCFZ, ambos da P&E Micro.

Execute o programa “progcfz” e escolha o algoritmo Am29_160bb_w.CFZ, em seguida será pedido o endereço base, escolha o endereço FFE00000.

Apague a flash através do comando “EM – Erase Module”, em seguida escolha o dbug.s19 através da opção “SS – Specify S record” e finalmente escolha a opção “PM – Program Module” para gravar o bootloader na flash.

Compilando o GDB-BDM

Descompacte o arquivo do bdm:
$ tar jxvf m68k-bdm-1.3.0.tar.bz2

Edite o arquivo driver/bdm.c mudando o BDM_REG_RAMBAR de 0xc04 para 0xc05 e o BDM_REG_MBAR de 0xc0f para 0xc04.

Entre em driver/linux e edite o arquivo m68k-bdm.c removendo as definições MOD_INC_USE_COUNT e MOD_DEC_USE_COUNT, estas macros são usadas nos kernels 2.4 e foram removidas do kernel 2.6.

Neste mesmo diretório (driver/linux) execute o comando:
# make all install

Após compilar e instalar o módulo execute o comando depmod para gerar a lista de dependências do módulo:
# depmod -a

Finalmente execute o comando para carregar o módulo:
# modprobe m68k-bdm

Volte ao diretório onde você extraiu o arquivo e execute o comando para criar os devices files para o módulo:
# ./m68k-bdm-1.3.0/local_scripts/MAKEDEV

Se não quiser executar o comando acima você pode criar o device file para o Coldfire com os comandos:
# mknod /dev/bdmcf0 c 34 4
# chmod 666 /dev/bdmcf0

Agora poderemos compilar e instalar as bibliotecas do bdm:
$ mkdir build
$ cd build
$ ../m68k-bdm-1.3.0/configure
$ make
# make install

Teste o BDM:
# cd test
# ./bdm-chk /dev/bdmcf0

Pronto, tudo deve ter funcionado corretamente

Mas ainda não acabou, apenas compilamos o BDM, precisamos compilar o GDB com um patch aplicado.

Retorne ao diretório onde você extraiu o m68k-bdm e descompacte o gdb:
$ tar jxvf gdb-6.1.tar.bz2

Aplique o patch:
$ cd gdb-6.1
$ patch -p1 < ../m68k-bdm-1.3.0/gdb/patches/gdb-6.1-bdm-m68k.patch

Configure e compile:
$ cd ..
$ rm -rf build/*
$ cd build
$ ../gdb-6.1/configure –target=m68k-bdm-elf
$ make
# make install

Pronto, agora já temos tudo instalado.

Podemos confirmar se está tudo funcionando através do comando:

# m68k-bdm-elf-gdb
(gdb) target bdm /dev/bdmcf0
Detected V2 core
GDB target bdm connected to /dev/bdmcf0
Coldfire debug module version is 0 (5206(e)/5272/5282)

Para visualizar os registradores da placa:
(gdb) select-frame 0
(gdb) info reg