]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/space-ia32.cpp
update
[l4.git] / kernel / fiasco / src / kern / ia32 / space-ia32.cpp
1 INTERFACE [ia32 || amd64]:
2
3 #include "spin_lock.h"
4
5 EXTENSION class Space
6 {
7 protected:
8   class Ldt
9   {
10   public:
11     Ldt() : _addr(0), _size(0) {}
12     Address addr() const { return (Address)_addr; }
13     Mword   size() const { return _size; }
14
15     void size(Mword);
16     void alloc();
17
18     ~Ldt();
19
20   private:
21     void *_addr;
22     Mword _size;
23   };
24
25   friend class Jdb_misc_debug;
26
27   Ldt _ldt;
28 };
29
30 // ---------------------------------------------------------------
31 IMPLEMENTATION [ia32 || amd64]:
32
33 #include "cpu.h"
34 #include "globals.h"
35
36 IMPLEMENT inline
37 void
38 Space::Ldt::size(Mword size)
39 { _size = size; }
40
41 IMPLEMENT inline
42 void
43 Space::Ldt::alloc()
44 {
45   // LDT maximum size is one page
46   _addr = Mapped_allocator::allocator()->alloc(Config::PAGE_SHIFT);
47   Mem::memset_mwords(reinterpret_cast<void *>(addr()), 0,
48                      Config::PAGE_SIZE / sizeof(Mword));
49 }
50
51 IMPLEMENT inline
52 Space::Ldt::~Ldt()
53 {
54   if (addr())
55     Mapped_allocator::allocator()->free(Config::PAGE_SHIFT,
56                                         reinterpret_cast<void*>(addr()));
57 }
58
59 IMPLEMENT inline NEEDS["cpu.h", "globals.h"]
60 void
61 Space::switchin_ldt() const
62 {
63   Cpu::cpus.cpu(current_cpu()).enable_ldt(_ldt.addr(), _ldt.size());
64 }