[Kos-dev] Double fault : ca continue

Thomas Petazzoni kos-dev@enix.org
Fri, 15 Jun 2001 10:24:56 +0200


salut,

nous avons realise quelques experimentations concernant les doubles
faults et les IRQs. Resume des resultats de ces experiences, menees sur
Bochs et sur de nombreuses machines (Celeron, Pentium, Pentium II, K6-2,
K7, Duron...).

- Lorsque le double fault a lieu pendant les push implicites servant
<E0>
lancer le handler d'IRQ incrimine, les valeurs sauvegardees dans le TSS
sont celles de la tache interrompue. Le EIP correspond donc a
l'instruction qui a ete interrompue, et le ESP correspond a l'adresse de
la pile, avant que le premier push implicite soit effectue. Dans ce cas,
au niveau du handler de double fault, on a (irr_master != 0 || irr_slave
!= 0, avec irr le registre qu'on peut lire sur le port 0x20 ou 0xA0, et
qui donne les IRQ en cours) et get_hw_isr_nested_level=0. Et l'action a
realiser est de modifier le TSS pour que le retour a la fin du DF se
fasse dans le handler d'IRQ, et de modifier la pile pour que le IRET de
fin du handler d'IRQ fasse retourner dans la tache interrompue. C'est
bricolage, mais c'est le seul moyen pour ne pas rater des IRQ :)

- Lorsque le double fault a lieu pendant l'execution du handler d'IRQ,
et bien les valeurs du TSS pointent vers une adresse dans le handler,
donc il suffit de corriger la pile, et de faire Iret pour revenir a
l'execution du handler. Ce cas est detectable par (irr_master != 0 ||
irr_slave != 0) avec get_hw_isr_nested_level=1.


Comment ca va se passer quand les IRQ commenceront a s'imbriquer, les
regles get_hw_isr_nested_level=0 ou 1, faudra changer de facon de faire.
Il faudra a mon avis comparer le nombre de bits a 1 dans les deux
registres IRR et le get_hw_isr_nested_level.

Quand au probleme que tu m'avais soumis d2, concernant la chronologie
des interruptions, il est normal que l'irq 0 soit executee avant l'irq 2
(etant donne les priorites). Donc je pense qu'il n'y a pas de probleme
(cf notre discussion icq de jeudi matin, vers 11h30-12h).

amicalement,

thomas

PS : j'ai hate d'en finir avec ce double fault ca commence a me prendre
le chou. j'aimerais plutot avancer du cote d'une gestion de memoire
virtuelle plus propre, vers du CPL3, vers, vers, vers, vers, vers,
vers...., avec lim(nombre(vers)) quand t augmente = + infini.

-- 
PETAZZONI Thomas
thomas.petazzoni@meridon.com
ICQ : 34937744
Projet KOS : http://kos.enix.org