3 votes

Comment changer le contexte du FPU dans le gestionnaire de signal (C++/Linux)

J'ai écrit un gestionnaire de signaux pour capturer les erreurs FPE. J'ai besoin de continuer l'exécution même si cela se produit. Je reçois un ucontext_t en paramètre, je peux changer le mauvais opérande de 0 à une autre valeur, mais le contexte FPU est toujours mauvais et je me retrouve dans une boucle infinie ?

Quelqu'un a-t-il déjà manipulé la structure ucontext_t sous Linux ?

J'ai finalement trouvé un moyen de gérer ces situations en effaçant le drapeau d'état de ucontext_t comme suit :

...
const long int cFPUStatusFlag = 0x3F;
aContext->uc_mcontext.fpregs->sw &= ~cFPUStatusFlag;
...

0x3F est désactivé pour mettre 0 dans les 6 bits du registre d'état de la FPU (x87). Cela implique de vérifier les exceptions FPE après le calcul.

0voto

Henry Fané Points 21

Sur un noyau linux 64 bits, je n'ai pas trouvé de moyen de réaliser la même chose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X