×

Bug de 34 anos no Macintosh Classic 2 era secretamente corrigido por instrução não documentada da CPU

Às vezes, você precisa desenterrar a velha placa de cortiça e o barbante vermelho para uma teoria da conspiração envolvendo e-mails vazados, ilhas de supervilões e chefes de estado desesperados para negar que tiveram qualquer envolvimento com Tudo Aquilo. Mas outras vezes, o buraco de coelho da conspiração surge de outras formas. Como, por exemplo:

📌 Um Macintosh Classic 2 emulado que trava inesperadamente na inicialização, levando a…

📌 Uma depuração intensa no emulador e em outro Mac antigo revelando um bug de 34 anos, levando a…

📌 A compra e reparo de um Macintosh Classic 2, levando a…

📌 A confirmação de que ele realmente nunca deveria ter conseguido inicializar em primeiro lugar.

Mas o Apple Macintosh Classic 2 inicializava perfeitamente, e é isso que torna o desfecho deste blog do programador Doug Brown tão fantástico. Por meio de uma série intensa e labiríntica de testes usando software e hardware, Brown descobriu que o último Mac all-in-one a usar uma tela preto e branco foi lançado com um bug que teria travado desastrosamente o computador todas as vezes que você o ligava — se não fosse por uma característica milagrosa e desconhecida de sua CPU Motorola 68030 que escondeu o problema dos programadores da Apple.

Brown descobriu o bug quando tentou inicializar um Macintosh Classic 2 emulado no MAME, um emulador mais conhecido por sistemas de arcade que também suporta uma enorme variedade de PCs clássicos e sistemas obscuros. Por razões de compatibilidade complexas demais para detalhar, o Mac Classic 2 conseguia inicializar em dois modos distintos, 24-bit e 32-bit, e o modo 32-bit travava na inicialização no MAME.

‘Por que isso estava acontecendo? E por que essa mesma falha não ocorria no hardware real?’, pergunta Brown em seu blog. ‘O Classic 2 não foi recolhido… Isso teria sido notícia em todos os veículos de tecnologia. Sem mencionar o fato de que as pessoas que realmente trabalhavam no código da ROM teriam notado rapidamente enquanto testavam. É um problema bem gritante. Então, o que está acontecendo? O MAME estava fazendo algo errado aqui que não correspondia ao hardware?… Eu tenho a resposta para essas perguntas, mas, como aviso prévio, a situação é muito mais complicada do que eu esperava.’

Brown entra em tremendo detalhe sobre como ele resolveu esse quebra-cabeça complicado, e é uma leitura fascinante mesmo que você não seja um programador, como eu, que só consegue entender verdadeiramente cerca de 30% disso. Mas ainda é uma história maluca mesmo se dermos um zoom para longe das instruções de computador granulares que ele discute passo a passo.

A essência do problema é que, ao executar seu código de inicialização no MAME, o Classic 2 realizava uma instrução que saltava para um endereço inválido localizado em ‘A1’ na memória e, como resultado, quando tentava executar sua próxima instrução, estava basicamente no local errado. ‘E bum, Sad Mac’.

Quando Brown depurou o código em um Macintosh 2ci da mesma era (que notavelmente também usava uma CPU Motorola 68030), ele descobriu que ele fazia algo um pouco diferente, transformando aquele endereço inválido em um válido.

‘O Classic 2 emulado no MAME estava travando porque A1 não mudava, então ainda continha um endereço inválido’, ele escreve. ‘No hardware, esta instrução estranha, que vários desmontadores se recusavam a tocar, e que nem mesmo era destinada a ser saltada porque começa no meio de uma instrução válida real, estava mudando A1 para um novo valor que era um endereço bom…’

‘Eu estava começando a acreditar em algo que soava quase louco demais para ser verdade: a Apple tinha um bug de salto fora dos limites na ROM do Classic 2 que deveria causar um Sad Mac durante a inicialização, mas eles não tinham ideia de que o bug estava lá porque o 68030 estava acidentalmente corrigindo o valor de A1 executando uma instrução não documentada. Como eu poderia provar que minha teoria estava correta?’

Testando no equipamento real, naturalmente.

Depois de elaborar essa teoria, Brown decidiu comprar um Mac Classic 2 usado, retirar sua placa lógica e limpá-lo para restaurá-lo ao funcionamento. Eu amo esta foto de seu Classic 2 improvisado que usa uma fonte de alimentação ATX moderna e um Raspberry Pi para enviar o sinal de vídeo para um dispositivo de captura para que ele puder tirar screenshots limpas.

Depois de escrever algumas instruções de teste para ver como o código de inicialização se comportaria usando os endereços válidos e inválidos que ele encontrou em A1 no Mac 2ci e no MAME, ele confirmou o que estava acontecendo.

‘Eu descobri uma instrução não documentada do MC68030 que executa um ciclo de barramento de leitura-modificação-gravação e também altera o valor do registrador A1’, ele escreve. ‘Esta instrução recém-descoberta acaba sendo a cola que está accidentalmente mantendo o Classic 2 unido. Sem esta instrução modificando A1, o Classic 2 não pode inicializar. Estou confiante de que foi um erro e não algo intencional. Um erro totalmente compreensível, diga-se de passagem. Se o irritante 68030 não tivesse escondido o bug dos desenvolvedores de ROM da Apple, não há dúvida de que eles o teriam detectado antes do Classic 2 ser lançado.’

Os desenvolvedores do MAME não tinham ideia de que esta instrução existia, então eles nunca a implementaram no comportamento do emulador. Essa foi a chave para descobrir a instrução secreta e sua correção crucial para o que teria sido um bug que impediria a inicialização. Um colaborador do MAME já corrigiu o bug para que o Mac Classic 2 possa inicializar no modo 32-bit.

Mas se não fosse pelo MAME, Brown ressalta que o bug provavelmente ‘teria passado despercebido por toda a eternidade’ porque não há nada obviamente errado na sequência de inicialização no hardware real. Isso por si só é meio incrível, porque o Motorola 68030 pertence a uma das famílias de processadores mais usadas de todos os tempos, alimentando PCs, consoles da Sega, impressoras e muito mais. Quantas instruções não documentadas a mais estão por aí, secretamente fazendo dispositivos antigos funcionarem?

A descoberta ‘mostra como bugs podem estar à espreita em segundo plano em lugares onde você pode pensar que tudo é totalmente polido’, ele escreve. ‘Acho que também é um bom exemplo de como alguns bugs simplesmente não são tão importantes. Este bug se encaixa muito bem nessa categoria. A máquina funcionava bem e ninguém percebeu.’

Share this content:

Publicar comentário