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. |
|
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 }; |
|
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 } |
|
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 } |