|
Descrição técnica errata atualizada nov. 20 1997
Problema: o CMPXCHG8B
8 instrução compara um valor byte em EDX e EAX com um 8 valor byte na memória (o
destino operando). A única destino válida operandos para essa instrução são memória
operandos. Se o destino operando é um registrar o processador deve gerar uma
exceção opcode inválido, a execução das instruções CMPXCHG8B deve ser interrompida e o
processador deve executar o opcode inválido exceção handler. Esta errata ocorre se o
prefixo TRAVAR se da instrução CMPXCHG8B com um (registro inválido) destino
operando. Neste caso, o processador pode não iniciar a execução de inválido opcode
exceção handler porque os ônibus bloqueado. Isso resulta em travamento do sistema.
Implicação: Se um (registro inválido) destino
operando é usado com o BLOQUEIO CMPXCHG8B instrução e o prefixo, o sistema pode congelar.
Não há dados da memória está corrompido e o usuário pode realizar uma reinicialização do sistema para voltar à
operação normal. Observe que o código inválido seqüência específica necessárias para esta errata para
ocorrer não é normalmente gerados no curso de programação nem é um desses
disponível comercialmente seqüência gerados pelo software.
Esta errata aplica-se somente aos
processadores Pentium®, os processadores Pentium com tecnologia MMX™, Pentium
processadores OverDrive® processadores OverDrive e Pentium com a tecnologia MMX. Processadores Pentium Pro,
Pentium II processadores e i486™ e anteriores não são afetados.
Para contornar o problema: Há duas soluções temporárias para esta errata para
sistemas operacionais de modo protegido. Ambas as soluções temporárias gerar uma página anomalia quando o
opcode inválido excepção ocorre. Em ambos os casos, a página fault será atendido antes do inválido
e evitar assim opcode exceção do travar condição acontecimento. Os
detalhes da implementação é diferente dependendo do sistema operacional. Use um dos seguintes métodos:
- A primeira parte desta solução temporária define os primeiros 7 entradas (0 a 6) da interrupção
descritor tabela (IDT) em não-gravável página. Quando o opcode inválido exceção
(exceção 6) ocorre devido à CMPXCHG8B bloqueado instrução com um registro inválido
(e apenas depois destino), o processador se gerar uma página fault se ela não tiver
acesso de gravação para a página contendo entrada 6 da IDT. A segunda parte desta solução temporária
modifica a página fault handler de identificar e corretamente expedir o opcode inválido
exceções que já estão roteadas através do página fault handler.
Parte I, IDT acesso à página
- Marcar a página contendo os primeiros 7 entradas (0 a 6) do IDT conforme lido só ao
estabelecer bit 1 da página entrada da tabela a zero. Também definir CR0.WP (bit 16) para 1. Agora quando o
opcode inválido excepção ocorre no bloqueado CMPXCHG8B instrução, o processador se
disparar uma página tolerância a uma vez que não têm acesso de gravação para a página contendo entrada 6 da
IDT. Esta página fault impede que os ônibus travar condição e dá ao sistema operacional controle completo
para processar os inválido operando exceção, conforme apropriado. Observe que exceção 6 é o
opcode inválido. assim, com exceção este esquema um SO tem controle completo de qualquer programa
executando uma instrução CMPXCHG8B inválido.
- Opcional: se há atualizações para as entradas 7-255 do IDT ocorrer durante o curso de
falhas de página operação normal, deve evitar grava a estes IDT entradas. Falhas de página Esses
podem ser evitados, alinhando o IDT através de uma página 4kb tal que o primeiro boundary sete
entradas (0 a 6) do IDT estão na primeira página só leitura e o restante entradas estão em
um leitura/gravação página.
Parte II, página Fault
Handler modificações
- Modificar a página fault handler para calcular o qual exceção causou a página anomalia utilizando
o fault endereço em CR2. Se o código de erro na pilha indica a exceção ocorreu
de anel 0 e se o endereço corresponde à inválido opcode exceção e, a seguir, pop o
código de erro da e vá para a pilha inválido opcode exceção handler. Caso contrário
continuar com a página normal fault handler.
OU
- Esta solução temporária tem duas partes. Primeiro, a interrupção descritor tabela (IDT) seja alinhado
tais que qualquer opcode inválido exceção fará uma página fault (devido à página não estar
presente). Segundo, a página fault handler é modificado para reconhecer e corretamente expedir
o opcode inválido exceção e de outras exceções que já estão roteadas através do
página fault handler.
Parte I, IDT orientação:
- Alinhe a interrupção descritor tabela (IDT)de modo que ele distribui um 4kb a
colocação da página boundary primeira entrada de 56 bytes da final do primeiro 4kb página. O que coloca
dos primeiros 7 entradas (0 a 6) na primeira página 4KB, e o restante as entradas na
segunda página.
- A página contendo os primeiros 7 entradas do IDT não deve ter um mapeamento no SO
página tabelas. Isso fará qualquer uma das exceções 0-6 para gerar uma página não presente fault. Uma
página fault impede que os ônibus travar condição e dá o controle completo SO para processar
estas excepções, conforme apropriado. Observe que exceção 6 é o opcode inválido. assim,
com exceção este esquema um SO tem controle completo de qualquer programa executando uma
instrução CMPXCHG8B inválido.
Parte II, página Fault Handler modificações:
- Reconhecer acessa a primeira página do IDT ao testar o fault endereço em CR2.
Página não está presente falhas do outro endereços podem ser processado normalmente.
- Para página não presente falhas na primeira página do IDT, o sistema operacional precisa reconhecer e
a excepção que causou dispatch a página não presente fault. Antes de continuar, teste
a tolerância a endereço em CR2 para determinar se está na faixa de endereço correspondente a
exceções 0-6.
- Calcular o que causou a página exceção não presente a tolerância a falhas de endereço em
CR2.
- Dependendo do sistema operacional, determinados nível de privilégio controlos podem ser necessárias, juntamente
com ajustamentos para a interrupção de pilha.
- Ir para o manipulador de um sistema adequado normal exceção.
Ambos os provisórias e só deve ser implementados sobre os processadores Intel que voltar família=5
através da instrução CPUID.
75/90/100/120/133/150/166 /133/200 MHz
processadores Pentium® e 120/133/150/166/200/233 MHz processadores Pentium com tecnologia MMX™
60 MHz e 66 MHz processadores Pentium®
|
Não. |
B1 |
C1 |
D1 |
ERRATA |
| 52 |
X |
X |
X |
Invalid operando
com instrução CMPXCHG8B bloqueado |
|
63/83/120/125/133/150/166 MHz Pentium®
OverDrive® processadores e 125/150/166/180/200 MHz Pentium OverDrive processadores
com tecnologia MMX™
|
Não. |
B1 |
B2 |
C0 |
Ta0 |
Ac0 |
Oxa3 |
Oxb1 |
ERRATA |
| 70 |
X |
X |
X |
X |
X |
X |
X |
Invalid operando
com instrução CMPXCHG8B bloqueado |
|
Isto se aplica a:
|