[Kos-dev] double fault fonctionnel !
Thomas Petazzoni
kos-dev@enix.org
Sat, 31 Mar 2001 11:05:07 +0200
salut a tous,
depuis hier soir, le double fault est fonctionnel... enfin il l'etait
depuis quelques temps deja, mais en fait nous lisions mal la valeur de
esp :
un asm("movl %%esp, %0":"=r"(new_esp)) ne mettait pas la bonne valeur.
peut etre que pour lire correctement l'adresse de la pile, il vaut
mieux faire un :
pushl %esp
popl %eax
movl %%eax, %0
enfin bref, pour etre sur, j'ai la chose qu'Hlide avait propose :
0:
cmpl $0x4001ffdc, %esp
je 0b
donc si l'adresse de la pile est 0x4001ffdc, et bien la chose fait une
boucle infinie. cette adresse 0X4001ffdc etait l'adresse renvoye par le
movl %%esp, %0.
et bien l'ordinateur ne fait pas une boucle infinie ! il poursuit son
execution. pour etre sur de mon coup, j'ai carrement fait un asm("int
$1"), avec un handler qui appelle dump_cpu_context, qui affiche entre
autres l'adresse de la pile. resultat :
pdt le double fault ==> Double fault handler is going to return
with new stack addr 0x5bcffe and with eip 0x5cc752
juste apres le test cmpl ==> after testing...the value !
generation int 1 ==> Uncaught Exception Number 1
puis le cpu_context
*** Dumping CPU Context ***
| ESP = 0x5bcfbe
| EIP = 0x5cc76b
| CS = 0x8
| EFLAGS = 0x246
| EAX = 0x0
| EBX = 0x2
| ECX = 0x4001ff93
| EDX = 0x66
| ESI = 0x0
| EDI = 0x0
*** End of CPU Context ***
on remarque bien que 0x5bcffe et 0xbcfbe appartiennent a la meme page,
et que la seconde est bien inferieure a la premiere... donc tout est bon
!
bref, il me reste deux choses : realiser le mapping de la pile au bon
endroit (pour l'instant on change de pile pour en mettre dans l'identity
mapping... et pas la ou il faut), puis magouiller le truc pour avoir via
des #ifdef le choix entre piles statiques et piles dynamiques...
voila la bonne nouvelle de la journee.
thomas
--
PETAZZONI Thomas
thomas.petazzoni@meridon.com UIN : 34937744
Projet KOS : http://kos.enix.org
Page Perso : http://www.enix.org/~thomas/