[Kos-dev] #DF et interruptions

d2 kos-dev@enix.org
07 Jun 2001 13:40:19 +0200


Bonjour,

Me vient alors une question (j'ai pas teste le bug, et encore moins
essaye d'investigue), ou plutot des interrogations.

Si le #DF apparait suite a un push explicite dans notre ISR a nous
qu'on a ecrit, le #DF doit etre capable de revenir dans l'ISR sans
probleme, non ? Dans ce cas, pas besoin de le relancer. A verifier.

Mais sinon, si le #DF est du au remplissage de la pile avec le
contexte interrompu *par le processeur soi-meme*, ie juste avant le
lancement de l'ISR, eh bien je suis pas sur que la solution "relancer
a la main l'ISR" soit la bonne, parce que le retour de l'ISR se fera
surement au mauvais endroit. Mais bon, meme sans se soucier de ce
probleme du retour de l'ISR, occupons nous "simplement" du contexte
sauvegardé au moment ou le #DF arrive. Quelques interrogations :
  - on n'est pas sur que le system tss (contexte interrompu) est
    charge avec qqch de correct :
      + quel eip ? celui de la tache ? Ou la premiere instruction (non
        executee) de l'ISR ?
      + quel esp ? cf suite...

  - on ne sait pas ce qui a ete empile ou pas empile avant la
    frontiere de page qui a cause le #DF. La pile etait-elle :

      =Pile=contexte=interrompu= <----- frontiere 4k
      ***BING*** (normalement : pour empiler eflags)

    ou alors :

      =Pile=contexte=interrompu=
      eflags  <----- frontiere 4k
      ***BING*** (normalement : pour empiler cs)

    ou plutot :

      =Pile=contexte=interrompu=
      eflags
      cs      <------ frontiere 4k
      ***BING*** (normalement : pour empiler eip)

    ou alors (cas exception avec error code) :

      =Pile=contexte=interrompu=
      eflags
      cs 
      eip     <------ frontiere 4k
      ***BING*** (normalement : pour empiler l'error code)

    Comment on differencie les 4 cas au niveau du #DF ? A quoi sera
    positionne le esp du contexte interrompu ?

Bref : comment detecter que le #DF est intervenu a l'interieur de
*notre* code d'ISR, ou a l'interieur de la sequence interne du
processeur (celle qui charge la pile avec le contexte interrompu) ?
Dans le 2eme cas, est-on sur de recuperer *quoi qu'il arrive* le
contexte 1/ de l'ISR interrompu, puis 2/ de la *tache* interrompue
(necessaire pour la fin de l'ISR), qui nous permette de retourner
correctement vers la tache interrompue ?

Faudrait essayer. Je suis pas sur que la doc Intel soit tres locace a
ce sujet.

Bonne journee,

-- 
d2