I'm using the kernel_fpu_begin
and kernel_fpu_end
functions in asm/i387.h to protect the FPU register states for some simple floating point arithmetic inside of a Linux kernel module.
I'm curious about the behavior of calling the kernel_fpu_begin
function twice before the kernel_fpu_end
function, and vice versa. For example:
#include <asm/i387.h>
double foo(unsigned num){
kernel_fpu_begin();
double x = 3.14;
x += num;
kernel_fpu_end();
return x;
}
...
kernel_fpu_begin();
double y = 1.23;
unsigned z = 42;
y -= foo(z);
kernel_fpu_end();
In the foo
function, I call kernel_fpu_begin
and kernel_fpu_end
; but kernel_fpu_begin
was already called before the call to foo
. Would this result in undefined behavior?
Furthermore, should I even be calling kernel_fpu_end
inside the foo
function? I return a double after the kernel_fpu_end
call, which means accessing floating point registers is unsafe right?
My initial guess is just not to use the kernel_fpu_begin
and kernel_fpu_end
calls inside the foo
function; but what if foo
returned the double cast to unsigned instead -- the programmer wouldn't know to use kernel_fpu_begin
and kernel_fpu_end
outside of foo
?