hw_x86_64: Perform lazy FPU state initialization

Perform lazy-initialization of FPU state when it is enabled for the
first time. This assures that the FXSAVE area (including the stored
MXCSR) is always properly setup and initialized to the platform default
values.
This commit is contained in:
Adrian-Ken Rueegsegger 2015-04-21 23:08:13 +02:00 committed by Christian Helmuth
parent a0ec317753
commit ded302c61c
1 changed files with 24 additions and 6 deletions

View File

@ -75,26 +75,44 @@ class Genode::Cpu_lazy_state
/**
* Load x87 FPU State from fxsave area.
*/
inline void load() { asm volatile ("fxrstor %0" : : "m" (*start)); }
inline void load()
{
if (!start) {
set_start();
init();
return;
}
asm volatile ("fxrstor %0" : : "m" (*start));
}
/**
* Save x87 FPU State to fxsave area.
*/
inline void save() { asm volatile ("fxsave %0" : "=m" (*start)); }
public:
/**
* Initialize FPU without checking for pending unmasked floating-point
* exceptions.
*/
inline void init() { asm volatile ("fninit"); };
/**
* Constructor
*
* Calculate 16-byte aligned start of FXSAVE area if necessary.
* Set 16-byte aligned start of fxsave area.
*/
inline Cpu_lazy_state()
inline void set_start()
{
start = fxsave_area;
if((addr_t)start & 15)
start = (char *)((addr_t)start & ~15) + 16;
};
public:
/**
* Constructor
*/
inline Cpu_lazy_state() : start(0) { };
} __attribute__((aligned(16)));