Page principale   Modules   Liste des composants   Liste des fichiers   Composants   Déclarations  

Gestion de contexte pour Linux IA32 (code natif)
[Interface de gestion de contexte]


Définitions des types

typedef int IA32FredContext [1]
 Contexte de sauvegarde : un pointeur de sommet de pile où on été empilés tous les autres registes.


Fonctions

void IA32FredContextRestore (IA32FredContext ctx)
 Restaurer un contexte processeur. Le contexte courant est perdu.

void IA32FredContextSwitch (IA32FredContext old, IA32FredContext ctx)
 Restaurer un contexte processeur. Le contexte courant est sauvé.

void IA32FredContextInit (IA32FredContext ctx, char *sp, void(*entry)())
 Initialiser un contexte processeur.


Documentation de la fonction

void IA32FredContextInit IA32FredContext    ctx,
char *    sp,
void(*    entry)()
 

Paramètres:
ctx  contexte à initialiser
sp  sommet de pile
entry  adresse de la procédure à démarrer
On initialise un registre pointeur de pile et un registre adresse d'instruction.



Implantation

C'est totalement dépendant du type de processeur et de la façon dont le code est généré par le compilateur C (ici gcc 3.2) pour passer les paramêtres dans la pile et entrer/sortir d'une procédure. Une fois ceci connu (en deassemblant du code généré par ex.), il suffit de décider de l'ordre de sauvegarde des registres.

Ici, seuls l'initialisation du la sauvegarde des registres pointeur de pile et compteur ordinal est nécessaire.

00231 {
00232   /* sauve eax ebx et ecx  pour pouvoir les utiliser*/
00233   asm("pushl %eax;pushl %ebx; pushl %ecx"); 
00234   /* sauve esp  dans ecx */ 
00235   asm(" movl %esp, %ecx");
00236   /* faire pointer eax sur ctx (déplacement 16 relativement à ecx)*/
00237   asm("  movl 16(%ecx), %eax");
00238   /* esp pointe sur nouvelle pile sp  (deplacement 20 relativement à ecx)*/
00239   asm("  movl 20(%ecx), %esp"); 
00240   /* ebx pointe sur la procedure initiale entry (deplacement 24 relativement à ecx)*/
00241   asm("  movl 24(%ecx), %ebx");
00242   /* simulation sauvegarde registres    */
00243   asm(" pushl %ebx "); /* point de démarrage */
00244   asm(" pushl $0 "); /* ebp bidon */
00245   asm(" pushl $0 "); /* eax  bidon */
00246   asm(" pushl $0 "); /* ebx  bidon */
00247   asm(" pushl $0 "); /* ecx  bidon */
00248   asm(" pushl $0 "); /* edx  bidon */
00249   asm(" pushl $0 "); /* edi  bidon */
00250   asm(" pushl $0 "); /* esi  bidon */
00251   /* sauver pointeur de pile nouveau dans ctx */
00252   asm(" movl %esp, 0(%eax)");
00253   /* restaure esp courant depuis ecx */
00254   asm(" movl %ecx ,%esp");
00255   /* restaure  eax ebx et ecx */
00256   asm("popl %ecx;popl %ebx;popl %eax");
00257   /* retour */ 
00258   asm(" ret");
00259 }; 

void IA32FredContextRestore IA32FredContext    ctx
 

Paramètres:
ctx  contexte à restaurer
C'est l'équivalent d'un goto sans espoir de reprise.



Implantation

C'est totalement dépendant du type de processeur et de la façon dont le code est généré par le compilateur C (ici gcc 3.2) pour passer les paramêtres dans la pile et entrer/sortir d'une procédure. Une fois ceci connu (en deassemblant du code généré par ex.), il suffit de décider de l'ordre de sauvegarde des registres.

Ici on dépile les registres de la pile dont le sommet est obtenu à partir du contexte.

00149 {
00150   /* esp pointeur sur le contexte ctx deplacement 4 relatif à esp*/
00151   asm( "movl 4(%esp), %esp");
00152   /* esp pointeur sur la pile à restaurer */
00153   asm( "movl 0(%esp), %esp");
00154   /*----- restaurer autres registres  ----- */ 
00155   asm( "popl %esi " );
00156   asm( "popl %edi " ); 
00157   asm( "popl %edx " ); 
00158   asm( "popl %ecx " ); 
00159   asm( "popl %ebx " ); 
00160   asm( "popl %eax " );
00161   asm( "popl %ebp " );
00162   asm( "ret" );
00163 } 

void IA32FredContextSwitch IA32FredContext    old,
IA32FredContext    ctx
 

Paramètres:
old  contexte où sauvegarder
ctx  contexte à restaurer


Implantation

C'est totalement dépendant du type de processeur et de la façon dont le code est généré par le compilateur C (ici gcc 3.2) pour passer les paramêtres dans la pile et entrer/sortir d'une procédure. Une fois ceci connu (en deassemblant du code généré par ex.), il suffit de décider de l'ordre de sauvegarde des registres.

Ici on empile les registres sur la pile, sauve le pointeur de pile dans le contexte old et on fait l'opération inverse depuis le contexte ctx.

00183 { 
00184   /*  ebp et eax sauvé sur  sur la pile */
00185   asm( "pushl %ebp  ");
00186   asm( "pushl %eax  ");
00187   /*ebp pointeur sur le contexte old  déplacement 12 relatif à  esp */ 
00188    asm(" movl 12(%esp), %ebp");
00189   /*eax pointeur sur le contexte new  déplacement 16 relatif à  esp*/ 
00190    asm(" movl 16(%esp), %eax");
00191   /*----- sauvver autres registres  ----- */ 
00192   asm( "pushl %ebx ");
00193   asm( "pushl %ecx ");   
00194   asm( "pushl %edx ");
00195   asm( "pushl %edi ");
00196   asm( "pushl %esi ");
00197   /* sauver esp dans le contexte old  */
00198   asm( "movl %esp ,0(%ebp)" );
00199   /* restaurer  nouvelle pile depuis  depuis eax (new) */
00200   asm( "movl 0(%eax),  %esp " );
00201   /*----- restaurer autres registres  ----- */ 
00202   asm( "popl %esi  ");
00203   asm( "popl  %edi "); 
00204   asm( "popl %edx  "); 
00205   asm( "popl  %ecx "); 
00206   asm( "popl  %ebx "); 
00207   asm( "popl  %eax ");
00208   asm( "popl  %ebp ");
00209   asm( "ret" );
00210 }


Généré le Mon Jan 5 16:22:06 2004 par doxygen1.2.17