#include #include #include void jmpfunction(jmp_buf env_buf); int main(int argc, char **argv) { int val; jmp_buf env_buffer; int fp = 124; __asm__ __volatile__("fninit\n" :::); __asm__ __volatile__("fldcw %[a]\n" :: [a]"m"(fp) :); __asm__ __volatile__("fnstcw %[a]\n" : [a]"=m"(fp) ::); printf("Starting value %#x\n", fp); /* save calling environment for longjmp */ val = setjmp( env_buffer ); if( val != 0 ) { __asm__ __volatile__("fnstcw %[a]\n" : [a]"=m"(fp) ::); printf("Returned from a longjmp() with value (we want the old one) = %#x\n", fp); exit(0); } printf("Jump function call\n"); jmpfunction( env_buffer ); return(0); } void jmpfunction(jmp_buf env_buf) { int fp = 0; __asm__ __volatile__("fldcw %[a]\n" :: [a]"m"(fp) :); printf("New value (to be rollbacked) %#x\n", fp); longjmp(env_buf, 10); }