23 //----------------------------------------------------------------------------
26 /* Empty class for VHW descriptor in KIP for native ia32 */
27 class Vhw_descriptor {};
29 //----------------------------------------------------------------------------
32 #include "mem_region.h"
40 char const *version_string() const;
42 // returns the 1st address beyond all available physical memory
43 Address main_memory_high() const;
45 enum Kernel_uart_info_type
47 Kernel_uart_info_invalid = 0,
48 Kernel_uart_info_ioport,
49 Kernel_uart_info_mmio,
52 struct Kernel_uart_info
65 static Kip *global_kip asm ("GLOBAL_KIP");
68 #define L4_KERNEL_INFO_MAGIC (0x4BE6344CL) /* "L4µK" */
70 //============================================================================
76 Mem_desc::Mem_desc(Address start, Address end, Mem_type t, bool v = false,
78 : _l((start & ~0x3ffUL) | (t & 0x0f) | ((st << 4) & 0x0f0)
84 Address Mem_desc::start() const
85 { return _l & ~0x3ffUL; }
88 Address Mem_desc::end() const
89 { return _h | 0x3ffUL; }
93 Mem_desc::type(Mem_type t)
94 { _l = (_l & ~0x0f) | (t & 0x0f); }
97 Mem_desc::Mem_type Mem_desc::type() const
98 { return (Mem_type)(_l & 0x0f); }
101 unsigned Mem_desc::ext_type() const
102 { return _l & 0x0f0; }
105 unsigned Mem_desc::is_virtual() const
106 { return _l & 0x200; }
109 bool Mem_desc::contains(unsigned long addr)
111 return start() <= addr && end() >= addr;
115 bool Mem_desc::valid() const
116 { return type() && start() < end(); }
119 Mem_desc *Kip::mem_descs()
120 { return (Mem_desc*)(((Address)this) + (_mem_info >> (MWORD_BITS/2))); }
123 Mem_desc const *Kip::mem_descs() const
124 { return (Mem_desc const *)(((Address)this) + (_mem_info >> (MWORD_BITS/2))); }
127 unsigned Kip::num_mem_descs() const
128 { return _mem_info & ((1UL << (MWORD_BITS/2))-1); }
131 void Kip::num_mem_descs (unsigned n)
133 _mem_info = (_mem_info & ~((1UL << (MWORD_BITS/2))-1)
134 | (n & ((1UL << (MWORD_BITS/2))-1)));
138 Mem_desc *Kip::add_mem_region(Mem_desc const &md)
140 Mem_desc *m = mem_descs();
141 Mem_desc *end = m + num_mem_descs();
144 if (m->type() == Mem_desc::Undefined)
151 // Add mem region failed -- must be a Fiasco startup problem. Bail out.
152 panic("Too few memory descriptors in KIP");
157 //----------------------------------------------------------------------------
163 { return (k()->processor_info & 0xffff) + 1; }
165 //----------------------------------------------------------------------------
166 IMPLEMENTATION [!mp]:
173 //----------------------------------------------------------------------------
179 Kip *Kip::global_kip;
180 PUBLIC static inline void Kip::init_global_kip (Kip *kip) { global_kip = kip; }
181 PUBLIC static inline Kip *Kip::k() { return global_kip; }
184 char const *Kip::version_string() const
186 return reinterpret_cast <char const *> (this) + (offset_version_strings << 4);
189 asm(".section .initkip.version, \"a\", %progbits \n" \
190 ".string \"" CONFIG_KERNEL_VERSION_STRING "\" \n" \
193 asm(".section .initkip.features.fini, \"a\", %progbits \n" \