[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" <<A=20
href=3D"mailto:thomas.petazzoni@meridon.com">thomas.petazzoni@meridon.com=
</A>><BR>To:=20
<<A =
href=3D"mailto:kos-dev@enix.org">kos-dev@enix.org</A>><BR>Sent:=20
Thursday, June 10, 1999 9:04 PM<BR>Subject: Re: [Kos-dev] Double=20
Fault</FONT></DIV>
<DIV> </DIV><FONT face=3DArial size=3D2>
<DIV><BR>><BR>> > A aucun moment, on ne d=E9pile un CS:EIP et =
EFLAGS=20
depuis la pile du<BR>Double<BR>> > Fault. C'est donc parce que ni =
un CALL,=20
ni un INT, ni une exception<BR>n'empile<BR>> > ces valeurs lors =
d'un TASK=20
GATE.<BR>><BR>> t'es sur ? alors quand je fais un dump_cpu_context =
ca=20
dumpe des valeurs<BR>> bidon c'est bien ca ?<BR>></DIV>
<DIV> </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> </DIV>
<DIV>> > Par contre je sais qu'un code error est empil=E9 dans la =
pile=20
Double Fault<BR>car<BR>> > c'est sp=E9cifi=E9 dans le manuel =
Intel, volume=20
3.<BR>><BR>> oui et ce code error est 0 !<BR>><BR>> > =
Conclusion=20
:<BR>> ><BR>> > 1)<BR>> > - v=E9rifier que le bit NT =
dans le=20
registre EFLAGS quand on tourne dans le<BR>TSS<BR>> > Double Fault =
est =E0=20
1;<BR>><BR>> le registre EFLAGS du TSS du DOuble Fault est egal a =
0x202 c=20
une valeur<BR>> acceptable : le bit reserve est bien a 1, et le bit =
IF aussi.=20
par contre<BR>> le NT ne l'est pas !</DIV>
<DIV> </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> </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> </DIV>
<DIV>><BR>> > - s'il ne l'est pas, le positionner dans le champ =
EFLAGS=20
du TSS Double<BR>Fault<BR>> > lors de son initialisation, comme =
=E7a, d=E8s le=20
premier Double Fault, ce<BR>bit<BR>> > sera d=E9j=E0=20
positionn=E9;<BR>><BR>> ok, je vais essayer de faire ca pour voir, =
parce=20
qu'en fiat si je<BR>> retourne du double fault comme ca, il genere un =
autre=20
double fault puis<BR>> encore un autre, et comme ca en boucle =
infinie. a=20
noter qu'a partir du<BR>> deuxieme double fault, le EFLAGS du TSS du =
Double=20
Fault est egal a<BR>> 0x206, c a d qu'en plus le bit PF (Parity) est =
a 1.=20
mais je ne pense pas<BR>> que cette valeur ait un sens.<BR>></DIV>
<DIV> </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> </DIV>
<DIV><BR>> > - si ce bit est remis =E0 0 lors d'un IRETD (en =
principe, non,=20
compte tenu<BR>de<BR>> > ce que je lis au-dessus, il ne le fait =
pas), ben=20
faut envisager alors de<BR>> > positionner ce bit =E0 1 avant le=20
IRETD.<BR>><BR>> ok, je vais verifier ca par la pratique =
aussi.</DIV>
<DIV> </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> </DIV>
<DIV>><BR>> > - avant de faire un iretd, ne pas oublier de =
d=E9piler le=20
code erreur<BR>(c'est<BR>> > au software de le faire et non au=20
CPU!).<BR>><BR>> bin en fait notre prehandler d'interruption, dans =
idt/idtasm.S empile<BR>> eax, ebx, ecx, edx, esi et edi, appelle le =
handler=20
correctement. puis<BR>> ensuite il depile eax, ebx, ecx, edx, esi et =
edi, et=20
enfin ajoute 4 a<BR>> esp pour sauter l'error code. donc de ce cote =
la je=20
pense que c'est bon.<BR>></DIV>
<DIV> </DIV>
<DIV>Okidoki :)</DIV>
<DIV> </DIV>
<DIV>Hlide</DIV>
<DIV> </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> </DIV>
<DIV></FONT> </DIV></BODY></HTML>
------=_NextPart_000_000E_01C0B320.63C11EE0--