[Kos-dev] Double Fault - IRETD avec EFLAGS.NT = 1

Christophe Avoinne (Club-Internet) kos-dev@yoda.isnpro.com
Thu, 22 Mar 2001 22:35:25 +0100


C'est un message de format MIME en plusieurs parties.

------=_NextPart_000_000E_01C0B320.63C11EE0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

----- Original Message -----
From: "Thomas Petazzoni" <thomas.petazzoni@meridon.com>
To: <kos-dev@enix.org>
Sent: Thursday, June 10, 1999 9:04 PM
Subject: Re: [Kos-dev] Double Fault


>
> > A aucun moment, on ne d=E9pile 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 ?
>

Ben c'est ce que je lis sur la s=E9quence d'ex=E9cution de l'instruction
IRET/IRETD dans la doc Intel en tout cas. Donc =E7a revient forc=E9ment =
=E0 dire
que ce que nous lisions =E9tait bien bidon (et compte tenu de ce que =
l'on
obtenait comme valeur, =E7a me rassurerait assez que ce soit le cas !).

> > Par contre je sais qu'un code error est empil=E9 dans la pile Double =
Fault
car
> > c'est sp=E9cifi=E9 dans le manuel Intel, volume 3.
>
> oui et ce code error est 0 !
>
> > Conclusion :
> >
> > 1)
> > - v=E9rifier que le bit NT dans le registre EFLAGS quand on tourne =
dans le
TSS
> > Double Fault est =E0 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 !

Ben faut le mettre =E0 1 lors de l'initialisation du TSS du DoubleFault. =
Ca
nous =E9vitera, je l'esp=E8re, d'avoir =E0 positionner ce bit avec des =
pushf et
des popf juste avant le IRETD.

Attention tu parles du registre EFLAGS lorsque l'on tourne dans le TSS =
du
DoubleFault ou de la valeur initiale dans le champ EFLAGS du TSS ? il
faudrait que tu vois quelle est la valeur de ce bit dans le registre =
EFLAGS.

>
> > - s'il ne l'est pas, le positionner dans le champ EFLAGS du TSS =
Double
Fault
> > lors de son initialisation, comme =E7a, d=E8s le premier Double =
Fault, ce
bit
> > sera d=E9j=E0 positionn=E9;
>
> 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 le bit NT =E9tait =E0 0, le IRETD ne fait pas un TASK SWITCH mais =
cherche
d=E9sesp=E9rement le triplet (EFLAGS,CS,EIP) dans la pile du =
DoubleFault, qui -
bien =E9videmment - n'existe pas ! donc on a forc=E9ment un #PF car on =
tente de
d=E9piler plus que l'on empile, et qu'on tombe alors probablement sur =
une page
non pr=E9sente pour la pile du DoubleFault, ben =E0 nouveau #DF. =
Seulement, le
TSS DoubleFault est =E9galement le TSS courant se trouvant dans le =
registre
TR, alors je m'explique pas que l'on puisse continuer =E0 faire un =
troisi=E8me
DoubleFault et plus... il doit avoir un truc... car je dois avoir un #GP
dans ce cas. A moins que l'on ait un #GP suivi d'un #DF qui redonne un =
#GP
et ainsi de suite en boucle infinie !? c'est pas clair, Thomas, faut que =
tu
m'expliques ce que tu obtiens.


> > - si ce bit est remis =E0 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 =E0 1 avant le IRETD.
>
> ok, je vais verifier ca par la pratique aussi.

J'esp=E8re qui ne le remet pas =E0 0. D'ailleurs je n'ai rien vu de =
semblable
dans la s=E9quence d'ex=E9cution du IRETD de la doc Intel.

>
> > - avant de faire un iretd, ne pas oublier de d=E9piler 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.
>

Okidoki :)

Hlide

P.S.: je ne peux pas faire de "reply" parce l'email =
kos-dev@yoda.isnpro.com ne marche pas !?



------=_NextPart_000_000E_01C0B320.63C11EE0
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 5.50.4134.100" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>----- Original Message -----<BR>From: =
"Thomas=20
Petazzoni" &lt;<A=20
href=3D"mailto:thomas.petazzoni@meridon.com">thomas.petazzoni@meridon.com=
</A>&gt;<BR>To:=20
&lt;<A =
href=3D"mailto:kos-dev@enix.org">kos-dev@enix.org</A>&gt;<BR>Sent:=20
Thursday, June 10, 1999 9:04 PM<BR>Subject: Re: [Kos-dev] Double=20
Fault</FONT></DIV>
<DIV>&nbsp;</DIV><FONT face=3DArial size=3D2>
<DIV><BR>&gt;<BR>&gt; &gt; A aucun moment, on ne d=E9pile un CS:EIP et =
EFLAGS=20
depuis la pile du<BR>Double<BR>&gt; &gt; Fault. C'est donc parce que ni =
un CALL,=20
ni un INT, ni une exception<BR>n'empile<BR>&gt; &gt; ces valeurs lors =
d'un TASK=20
GATE.<BR>&gt;<BR>&gt; t'es sur ? alors quand je fais un dump_cpu_context =
ca=20
dumpe des valeurs<BR>&gt; bidon c'est bien ca ?<BR>&gt;</DIV>
<DIV>&nbsp;</DIV>
<DIV>Ben c'est ce que je lis sur la s=E9quence d'ex=E9cution de=20
l'instruction<BR>IRET/IRETD dans la doc Intel en tout cas. Donc =E7a =
revient=20
forc=E9ment =E0 dire<BR>que ce que nous lisions =E9tait bien bidon (et =
compte tenu de=20
ce que l'on<BR>obtenait comme valeur, =E7a me rassurerait assez que ce =
soit le cas=20
!).</DIV>
<DIV>&nbsp;</DIV>
<DIV>&gt; &gt; Par contre je sais qu'un code error est empil=E9 dans la =
pile=20
Double Fault<BR>car<BR>&gt; &gt; c'est sp=E9cifi=E9 dans le manuel =
Intel, volume=20
3.<BR>&gt;<BR>&gt; oui et ce code error est 0 !<BR>&gt;<BR>&gt; &gt; =
Conclusion=20
:<BR>&gt; &gt;<BR>&gt; &gt; 1)<BR>&gt; &gt; - v=E9rifier que le bit NT =
dans le=20
registre EFLAGS quand on tourne dans le<BR>TSS<BR>&gt; &gt; Double Fault =
est =E0=20
1;<BR>&gt;<BR>&gt; le registre EFLAGS du TSS du DOuble Fault est egal a =
0x202 c=20
une valeur<BR>&gt; acceptable : le bit reserve est bien a 1, et le bit =
IF aussi.=20
par contre<BR>&gt; le NT ne l'est pas !</DIV>
<DIV>&nbsp;</DIV>
<DIV>Ben faut le mettre =E0 1 lors de l'initialisation du TSS du =
DoubleFault.=20
Ca<BR>nous =E9vitera, je l'esp=E8re, d'avoir =E0 positionner ce bit avec =
des pushf=20
et<BR>des popf juste avant le IRETD.</DIV>
<DIV>&nbsp;</DIV>
<DIV>Attention tu parles du registre EFLAGS lorsque l'on tourne dans le =
TSS=20
du<BR>DoubleFault ou de la valeur initiale dans le champ EFLAGS du TSS ? =

il<BR>faudrait que tu vois quelle est la valeur de ce bit dans le =
registre=20
EFLAGS.</DIV>
<DIV>&nbsp;</DIV>
<DIV>&gt;<BR>&gt; &gt; - s'il ne l'est pas, le positionner dans le champ =
EFLAGS=20
du TSS Double<BR>Fault<BR>&gt; &gt; lors de son initialisation, comme =
=E7a, d=E8s le=20
premier Double Fault, ce<BR>bit<BR>&gt; &gt; sera d=E9j=E0=20
positionn=E9;<BR>&gt;<BR>&gt; ok, je vais essayer de faire ca pour voir, =
parce=20
qu'en fiat si je<BR>&gt; retourne du double fault comme ca, il genere un =
autre=20
double fault puis<BR>&gt; encore un autre, et comme ca en boucle =
infinie. a=20
noter qu'a partir du<BR>&gt; deuxieme double fault, le EFLAGS du TSS du =
Double=20
Fault est egal a<BR>&gt; 0x206, c a d qu'en plus le bit PF (Parity) est =
a 1.=20
mais je ne pense pas<BR>&gt; que cette valeur ait un sens.<BR>&gt;</DIV>
<DIV>&nbsp;</DIV>
<DIV>Si le bit NT =E9tait =E0 0, le IRETD ne fait pas un TASK SWITCH =
mais=20
cherche<BR>d=E9sesp=E9rement le triplet (EFLAGS,CS,EIP) dans la pile du =
DoubleFault,=20
qui -<BR>bien =E9videmment - n'existe pas ! donc on a forc=E9ment un #PF =
car on=20
tente de<BR>d=E9piler plus que l'on empile, et qu'on tombe alors =
probablement sur=20
une page<BR>non pr=E9sente pour la pile du DoubleFault, ben =E0 nouveau =
#DF.=20
Seulement, le<BR>TSS DoubleFault est =E9galement le TSS courant se =
trouvant dans=20
le registre<BR>TR, alors je m'explique pas que l'on puisse continuer =E0 =
faire un=20
troisi=E8me<BR>DoubleFault et plus... il doit avoir un truc... car je =
dois avoir=20
un #GP<BR>dans ce cas. A moins que l'on ait un #GP suivi d'un #DF qui =
redonne un=20
#GP<BR>et ainsi de suite en boucle infinie !? c'est pas clair, Thomas, =
faut que=20
tu<BR>m'expliques ce que tu obtiens.</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>&gt; &gt; - si ce bit est remis =E0 0 lors d'un IRETD (en =
principe, non,=20
compte tenu<BR>de<BR>&gt; &gt; ce que je lis au-dessus, il ne le fait =
pas), ben=20
faut envisager alors de<BR>&gt; &gt; positionner ce bit =E0 1 avant le=20
IRETD.<BR>&gt;<BR>&gt; ok, je vais verifier ca par la pratique =
aussi.</DIV>
<DIV>&nbsp;</DIV>
<DIV>J'esp=E8re qui ne le remet pas =E0 0. D'ailleurs je n'ai rien vu de =

semblable<BR>dans la s=E9quence d'ex=E9cution du IRETD de la doc =
Intel.</DIV>
<DIV>&nbsp;</DIV>
<DIV>&gt;<BR>&gt; &gt; - avant de faire un iretd, ne pas oublier de =
d=E9piler le=20
code erreur<BR>(c'est<BR>&gt; &gt; au software de le faire et non au=20
CPU!).<BR>&gt;<BR>&gt; bin en fait notre prehandler d'interruption, dans =

idt/idtasm.S empile<BR>&gt; eax, ebx, ecx, edx, esi et edi, appelle le =
handler=20
correctement. puis<BR>&gt; ensuite il depile eax, ebx, ecx, edx, esi et =
edi, et=20
enfin ajoute 4 a<BR>&gt; esp pour sauter l'error code. donc de ce cote =
la je=20
pense que c'est bon.<BR>&gt;</DIV>
<DIV>&nbsp;</DIV>
<DIV>Okidoki :)</DIV>
<DIV>&nbsp;</DIV>
<DIV>Hlide</DIV>
<DIV>&nbsp;</DIV>
<DIV>P.S.: je ne peux pas faire de "reply" parce l'email <A=20
href=3D"mailto:kos-dev@yoda.isnpro.com">kos-dev@yoda.isnpro.com</A> ne =
marche pas=20
!?</DIV>
<DIV>&nbsp;</DIV>
<DIV></FONT>&nbsp;</DIV></BODY></HTML>

------=_NextPart_000_000E_01C0B320.63C11EE0--