19#include <l4/cxx/static_vector>
81 static unsigned long &memory_info(
void *kip)
noexcept
82 {
return *(
reinterpret_cast<unsigned long *
>(kip) + 21); }
84 static unsigned long memory_info(
void const *kip)
noexcept
85 {
return *(
reinterpret_cast<unsigned long const *
>(kip) + 21); }
97 return reinterpret_cast<Mem_desc *
>(
reinterpret_cast<char *
>(kip)
98 + (memory_info(kip) >> ((
sizeof(
unsigned long) / 2) * 8)));
103 char const *addr =
reinterpret_cast<char const *
>(kip)
104 + (memory_info(kip) >> ((
sizeof(
unsigned long) / 2) * 8));
105 return reinterpret_cast<Mem_desc const *
>(addr);
115 static unsigned long count(
void const *kip)
noexcept
117 return memory_info(kip)
118 & ((1UL << ((
sizeof(
unsigned long) / 2) * 8)) - 1);
115 static unsigned long count(
void const *kip)
noexcept {
…}
129 unsigned long &mi = memory_info(kip);
130 mi = (mi & ~((1UL << ((
sizeof(
unsigned long) / 2) * 8)) - 1)) |
count;
169 Mem_type t,
unsigned char st = 0,
bool virt =
false,
170 bool eager =
false) noexcept
171 : _l((
start & ~0x3ffUL) | (t & 0x0f) | ((st << 4) & 0x0f0)
172 | (virt ? 0x0200 : 0x0) | (eager ? 0x100 : 0x0)), _h(
end | 0x3ffUL)
180 unsigned long start() const noexcept {
return _l & ~0x3ffUL; }
187 unsigned long end() const noexcept {
return _h | 0x3ffUL; }
203 return static_cast<Mem_type>(_l & 0x0f);
211 unsigned char sub_type() const noexcept {
return (_l >> 4) & 0x0f; }
225 unsigned eager_map() const noexcept {
return _l & 0x100; }
240 Mem_type t,
unsigned char st = 0,
bool virt =
false,
241 bool eager =
false) noexcept
243 _l = (
start & ~0x3ffUL) | (t & 0x0f) | ((st << 4) & 0x0f0)
244 | (virt?0x0200:0x0) | (eager ? 0x0100 : 0x0);
Memory descriptors stored in the kernel interface page.
Mem_type type() const noexcept
Return type of the memory descriptor.
static void count(void *kip, unsigned count) noexcept
Set number of memory descriptors.
unsigned long end() const noexcept
Return end address of memory descriptor.
unsigned long start() const noexcept
Return start address of memory descriptor.
Arch_sub_type_common
Common sub types across all architectures for the Mem_type::Arch type.
@ Arch_acpi_tables
Firmware ACPI tables.
@ Arch_acpi_nvs
Firmware reserved address space.
void set(unsigned long start, unsigned long end, Mem_type t, unsigned char st=0, bool virt=false, bool eager=false) noexcept
Set values of a memory descriptor.
static cxx::static_vector< Mem_desc const > all(void const *kip)
Return enumerable list of memory descriptors.
unsigned is_virtual() const noexcept
Return whether the memory descriptor describes a virtual or physical region.
Info_sub_type
Memory sub types for the Mem_type::Info type.
@ Info_acpi_rsdp
Physical address of the ACPI root pointer.
Mem_desc(unsigned long start, unsigned long end, Mem_type t, unsigned char st=0, bool virt=false, bool eager=false) noexcept
Initialize memory descriptor.
unsigned eager_map() const noexcept
Return whether the region shall be eligible for eager mapping in sigma0 or the root task.
static cxx::static_vector< Mem_desc > all(void *kip)
Return enumerable list of memory descriptors.
@ Reserved
Reserved region, do not use this memory.
@ Conventional
Conventional memory.
@ Info
Info by boot loader.
@ Undefined
Undefined memory.
@ Arch
Architecture specific memory.
@ Bootloader
Memory belongs to the boot loader.
unsigned long size() const noexcept
Return size of region described by the memory descriptor.
static unsigned long count(void const *kip) noexcept
Return number of memory descriptors stored in the kernel info page.
static Mem_desc * first(void *kip) noexcept
Get first memory descriptor.
unsigned char sub_type() const noexcept
Return sub-type of the memory descriptor.
Simple encapsulation for a dynamically allocated array.
L4 low-level kernel interface.