[Kos-dev] double fault fonctionnel !

Thomas Petazzoni kos-dev@enix.org
Thu, 05 Apr 2001 17:55:22 +0200


voici le code de notre thread de test :

void test_lost_of_irq(void *data)
{
  asm("0: movl $0xDEADBEEF, %esp\n\t
       hlt\n\t
       jmp 0b");
}  


voici le code de notre handler de double fault, la partie
interessante...

  printk("coucou generated by task gate handler\n");

  asm("movl %%esp, %0":"=r"(esp0));
  __bochs_printk("ESP seems to be 0x%x\n", esp0);  
  asm("pushf\n
       pop %%eax\n
       movl %%eax, %0":"=r"(esp0));
  __bochs_printk("Real EFLAGS is 0x%x\n", esp0);

  dump_cpu_context(cpu_context);
  printk("Eflags is 0x%x (esp=0x%x)\n", cpu_context->eflags,
(unsigned)cpu_context);

  double_fault_tss = get_double_fault_tss();
  system_tss = get_system_tss();
  __bochs_printk("old esp system tss addr is 0x%x\n", system_tss->esp);


  new_stack_addr = get_physical_page();
  new_stack_addr += PAGE_SIZE-1;


  show_all_thread_info();
  if (system_tss->esp == 0xDEADBEEF)
    {
      *(screen +1) = 6; 
      (*screen)++;
      __bochs_printk("irq lost.. or not ?\n");
       system_tss->esp =  double_fault_tss->esp0 - 512; 
       system_tss->eip++; // saute l'instruction "hlt"
       return cpu_context;
    }


> 1°) la barre tournante du timer 0 continue de tourner : l'IRQ est bien
> exécuté après ou pendant un #DF ! ca signifie que le signal IRQ a été
> maintenu jusqu'à ce qu'il puisse avoir lieu.
> 2°) la barre tournante du timer 0 ne bouge plus : les IRQ sont
> irrémédiablement perdus. Il faut envisager un système plus compliqué pour
> compenser.

voici ce qui se passe : le double fault est bien execute une fois, et le
caractere est bien incremente a l'ecran (*screen)++; ainsi que le
message affiche via bochs_printk. mais apres cette premiere fois, plus
rien ne se passe... les twiddles ne tournent plus :(((

pourtant on peut noter que apres l'execution du double fault, le primary
thread, qui lance le thread de test continue son execution : il affiche
des messages, et si on ajoute un show_all_thread_info() il execute bien
la fonction. bref le systeme semble bloque, mais pourtant le primary
thread continue son execution... surement que le timer, ne fonctionnant
plus lui laisse la main, et il execute tout son bazar peinard.

bref d'apres les premiers tests, il va falloir tester si un IRQ a genere
le double fault... et reparer ce qu'il faut si besoin est.

Hlide au secours ...
thomas

-- 
PETAZZONI Thomas
thomas.petazzoni@meridon.com     UIN : 34937744
Projet KOS : http://kos.enix.org
Page Perso : http://www.enix.org/~thomas/