[Kos-dev] Double Fault
Thomas Petazzoni
kos-dev@yoda.isnpro.com
Thu, 10 Jun 1999 22:04:43 +0200
> A aucun moment, on ne dépile un CS:EIP et EFLAGS depuis la pile du Double
> Fault. C'est donc parce que ni un CALL, ni un INT, ni une exception n'empile
> ces valeurs lors d'un TASK GATE.
t'es sur ? alors quand je fais un dump_cpu_context ca dumpe des valeurs
bidon c'est bien ca ?
> Par contre je sais qu'un code error est empilé dans la pile Double Fault car
> c'est spécifié dans le manuel Intel, volume 3.
oui et ce code error est 0 !
> Conclusion :
>
> 1)
> - vérifier que le bit NT dans le registre EFLAGS quand on tourne dans le TSS
> Double Fault est à 1;
le registre EFLAGS du TSS du DOuble Fault est egal a 0x202 c une valeur
acceptable : le bit reserve est bien a 1, et le bit IF aussi. par contre
le NT ne l'est pas !
> - s'il ne l'est pas, le positionner dans le champ EFLAGS du TSS Double Fault
> lors de son initialisation, comme ça, dès le premier Double Fault, ce bit
> sera déjà positionné;
ok, je vais essayer de faire ca pour voir, parce qu'en fiat si je
retourne du double fault comme ca, il genere un autre double fault puis
encore un autre, et comme ca en boucle infinie. a noter qu'a partir du
deuxieme double fault, le EFLAGS du TSS du Double Fault est egal a
0x206, c a d qu'en plus le bit PF (Parity) est a 1. mais je ne pense pas
que cette valeur ait un sens.
> - si ce bit est remis à 0 lors d'un IRETD (en principe, non, compte tenu de
> ce que je lis au-dessus, il ne le fait pas), ben faut envisager alors de
> positionner ce bit à 1 avant le IRETD.
ok, je vais verifier ca par la pratique aussi.
> - avant de faire un iretd, ne pas oublier de dépiler le code erreur (c'est
> au software de le faire et non au CPU!).
bin en fait notre prehandler d'interruption, dans idt/idtasm.S empile
eax, ebx, ecx, edx, esi et edi, appelle le handler correctement. puis
ensuite il depile eax, ebx, ecx, edx, esi et edi, et enfin ajoute 4 a
esp pour sauter l'error code. donc de ce cote la je pense que c'est bon.
thomas