Halt and Catch Fire
Halt and Catch Fire (fermati e prendi fuoco), indicato con la sigla mnemonica di HCF, è un'istruzione fittizia del linguaggio assembly - intesa prevalentemente come uno scherzo - che è stata usata per definire istruzioni solitamente non documentate che portano la CPU in uno stato da cui può essere fatta uscire solo con un reset.
Solitamente con la sigla HCF si descrive una o più istruzioni non documentate presenti in molte architetture e utilizzate per poter effettuare agevolmente particolari test durante lo sviluppo dei prodotti, ma che non sono da utilizzarsi nella normale operatività.
Origine
modificaSi ritiene che l'origine del nome risalga ad un aneddoto apocrifo in circolazione nei primi anni sessanta del XX secolo. Si raccontava che gli ingegneri che lavoravano allo sviluppo sui computer IBM System/360 avessero aumentato le correnti di lettura/scrittura delle memorie a nucleo magnetico al fine di migliorare le prestazioni. La modifica non avrebbe avuto effetti durante la normale operatività del computer, ma purtroppo l'istruzione di spegnimento HALT era implementata con un ciclo generato da un'istruzione di salto a se stessa, cosa che provocava l'accesso ripetuto e rapidissimo alla medesima cella di memoria, il che avrebbe provocato il surriscaldamento dei fili al punto che essi avrebbero iniziato a fumare.
Nelle CPU moderne
modificaMotorola 6800
modificaIl microprocessore Motorola 6800 è il primo prodotto dove è stata identificata un'istruzione HCF. L'istruzione, introdotta quasi sicuramente durante le fasi di test del prodotto, spinge il processore a modificare rapidamente le uscite delle linee collegate al bus di sistema, consentendo una rapida verifica del funzionamento di tutte le linee.
L'uso di tale codice mette il processore in uno stato in cui non può più rispondere agli interrupt, cosicché l'unico modo per ritornare alla normale attività è quello di resettare l'apparato.
La medesima istruzione è presente nel microprocessore Motorola 6809.
Intel x86
modificaIl processore Intel 8086 e i successivi processori della serie x86 implementano un'istruzione HLT (alt) che interrompe l'esecuzione delle istruzioni e mette il processore in uno stato di blocco. Esistono una serie di condizioni (un interrupt, un'eccezione di debug e vari altri segnali) che riportano il processore nello stato normale.
Tuttavia le prime versioni del chip IntelDX4 avevano un problema che impediva a tali eventi di far tornare allo stato normale il processore, cosa che in effetti rendeva il comportamento dell'istruzione HLT equivalente ad un'istruzione HCF.
Pentium F00F bug
modificaMolti processori della linea Intel Pentium possono essere bloccati mandando in esecuzione del codice macchina contenente la sequenza di byte F0 0F C7 C8
, corrispondente all'istruzione assembly:
lock cmpxchg8b eax
L'istruzione comparerebbe il valore dei registri edx e eax con un valore a 8 byte di una locazione di memoria, ma in questo caso al posto della locazione di memoria è usato un registro della CPU. In circostanze normali, l'istruzione provocherebbe un'eccezione, ma l'uso del prefisso lock (che di solito previene l'accesso contemporaneo di due processori alla stessa locazione di memoria) spinge la CPU ad utilizzare una modalità di accesso al bus non consentita, bloccando l'esecuzione immediatamente dopo. Tale comportamento è conosciuto con il nome Pentium F00F bug. Sebbene nessun compilatore generi codice macchina con tale istruzione, un hacker può inserirla appositamente in un programma causando il blocco del computer dove questo venga eseguito.
Dopo la scoperta del bug, sono stati sviluppati dei meccanismi per prevenire il blocco del computer. Il bug è stato corretto nei processori Intel delle serie successive.