]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/fpu_alloc.cpp
update
[l4.git] / kernel / fiasco / src / kern / fpu_alloc.cpp
1 INTERFACE:
2
3 #include "fpu.h"
4
5 class Ram_quota;
6
7 class Fpu_alloc : public Fpu
8 {
9 };
10
11 IMPLEMENTATION:
12
13 #include "fpu_state.h"
14 #include "kmem_slab.h"
15 #include "ram_quota.h"
16 #include "slab_cache_anon.h"
17
18 static Kmem_slab _fpu_state_allocator(Fpu::state_size() + sizeof(Ram_quota*),
19                                       Fpu::state_align(), "Fpu state");
20
21 PRIVATE static
22 slab_cache_anon *
23 Fpu_alloc::slab_alloc()
24 {
25   return &_fpu_state_allocator;
26 }
27
28 PUBLIC static
29 bool
30 Fpu_alloc::alloc_state(Ram_quota *q, Fpu_state *s) 
31 {
32   unsigned long sz = Fpu::state_size();
33   void *b;
34   if (!(b = slab_alloc()->q_alloc(q)))
35     return false;
36
37   *((Ram_quota **)((char*)b + sz)) = q;
38   s->_state_buffer = b;
39   Fpu::init_state(s);
40
41   return true;
42 }
43
44 PUBLIC static
45 void
46 Fpu_alloc::free_state(Fpu_state *s) 
47 {
48   if (s->_state_buffer) 
49     {
50       unsigned long sz = Fpu::state_size();
51       Ram_quota *q = *((Ram_quota **)((char*)(s->_state_buffer) + sz));
52       slab_alloc()->q_free (q, s->_state_buffer);
53       s->_state_buffer = 0;
54
55       // transferred FPU state may leed to quotas w/o a task but only FPU 
56       // contexts allocated
57       if (q->current()==0)
58         delete q;
59     }
60 }
61