mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-30 02:28:54 +00:00
safeguard the synchronized allocator template
* Move the Synced_interface from os -> base * Align the naming of "synchronized" helpers to "Synced_*" * Move Synced_range_allocator to core's private headers * Remove the raw() and lock() members from Synced_allocator and Synced_range_allocator, and re-use the Synced_interface for them * Make core's Mapped_mem_allocator a friend class of Synced_range_allocator to enable the needed "unsafe" access of its physical and virtual allocators Fix #1697
This commit is contained in:
parent
53eb666ed0
commit
ccb968ff7d
@ -15,9 +15,9 @@
|
|||||||
#ifndef _CORE__INCLUDE__PLATFORM_H_
|
#ifndef _CORE__INCLUDE__PLATFORM_H_
|
||||||
#define _CORE__INCLUDE__PLATFORM_H_
|
#define _CORE__INCLUDE__PLATFORM_H_
|
||||||
|
|
||||||
#include <base/sync_allocator.h>
|
|
||||||
#include <base/allocator_avl.h>
|
#include <base/allocator_avl.h>
|
||||||
|
|
||||||
|
#include "synced_range_allocator.h"
|
||||||
#include "platform_generic.h"
|
#include "platform_generic.h"
|
||||||
#include "platform_thread.h"
|
#include "platform_thread.h"
|
||||||
#include "platform_pd.h"
|
#include "platform_pd.h"
|
||||||
@ -33,7 +33,7 @@ namespace Genode {
|
|||||||
/*
|
/*
|
||||||
* Shortcut for the type of allocator instances for physical resources
|
* Shortcut for the type of allocator instances for physical resources
|
||||||
*/
|
*/
|
||||||
typedef Synchronized_range_allocator<Allocator_avl> Phys_allocator;
|
typedef Synced_range_allocator<Allocator_avl> Phys_allocator;
|
||||||
|
|
||||||
char _core_label[1]; /* to satisfy _core_pd */
|
char _core_label[1]; /* to satisfy _core_pd */
|
||||||
Platform_pd *_core_pd; /* core protection domain object */
|
Platform_pd *_core_pd; /* core protection domain object */
|
||||||
|
@ -49,9 +49,9 @@ static const bool verbose_region_alloc = false;
|
|||||||
** Core address space management **
|
** Core address space management **
|
||||||
***********************************/
|
***********************************/
|
||||||
|
|
||||||
static Synchronized_range_allocator<Allocator_avl> &_core_address_ranges()
|
static Synced_range_allocator<Allocator_avl> &_core_address_ranges()
|
||||||
{
|
{
|
||||||
static Synchronized_range_allocator<Allocator_avl> _core_address_ranges(0);
|
static Synced_range_allocator<Allocator_avl> _core_address_ranges(nullptr);
|
||||||
return _core_address_ranges;
|
return _core_address_ranges;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -457,7 +457,7 @@ void Platform::_setup_rom()
|
|||||||
|
|
||||||
|
|
||||||
Platform::Platform() :
|
Platform::Platform() :
|
||||||
_ram_alloc(0), _io_mem_alloc(core_mem_alloc()),
|
_ram_alloc(nullptr), _io_mem_alloc(core_mem_alloc()),
|
||||||
_io_port_alloc(core_mem_alloc()), _irq_alloc(core_mem_alloc()),
|
_io_port_alloc(core_mem_alloc()), _irq_alloc(core_mem_alloc()),
|
||||||
_region_alloc(core_mem_alloc())
|
_region_alloc(core_mem_alloc())
|
||||||
{
|
{
|
||||||
@ -475,13 +475,13 @@ Platform::Platform() :
|
|||||||
_setup_rom();
|
_setup_rom();
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
printf(":ram_alloc: "); _ram_alloc.raw()->dump_addr_tree();
|
printf(":ram_alloc: "); _ram_alloc()->dump_addr_tree();
|
||||||
printf(":region_alloc: "); _region_alloc.raw()->dump_addr_tree();
|
printf(":region_alloc: "); _region_alloc()->dump_addr_tree();
|
||||||
printf(":io_mem: "); _io_mem_alloc.raw()->dump_addr_tree();
|
printf(":io_mem: "); _io_mem_alloc()->dump_addr_tree();
|
||||||
printf(":io_port: "); _io_port_alloc.raw()->dump_addr_tree();
|
printf(":io_port: "); _io_port_alloc()->dump_addr_tree();
|
||||||
printf(":irq: "); _irq_alloc.raw()->dump_addr_tree();
|
printf(":irq: "); _irq_alloc()->dump_addr_tree();
|
||||||
printf(":rom_fs: "); _rom_fs.print_fs();
|
printf(":rom_fs: "); _rom_fs.print_fs();
|
||||||
printf(":core ranges: "); _core_address_ranges().raw()->dump_addr_tree();
|
printf(":core ranges: "); _core_address_ranges()()->dump_addr_tree();
|
||||||
}
|
}
|
||||||
|
|
||||||
Fiasco::l4_threadid_t myself = Fiasco::l4_myself();
|
Fiasco::l4_threadid_t myself = Fiasco::l4_myself();
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
#include <base/allocator_avl.h>
|
#include <base/allocator_avl.h>
|
||||||
#include <base/exception.h>
|
#include <base/exception.h>
|
||||||
#include <base/lock.h>
|
#include <base/lock.h>
|
||||||
#include <base/sync_allocator.h>
|
#include <synced_range_allocator.h>
|
||||||
|
|
||||||
namespace Genode {
|
namespace Genode {
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ namespace Genode {
|
|||||||
CAP_ID_OFFSET = 1 << 2
|
CAP_ID_OFFSET = 1 << 2
|
||||||
};
|
};
|
||||||
|
|
||||||
Synchronized_range_allocator<Allocator_avl> _id_alloc;
|
Synced_range_allocator<Allocator_avl> _id_alloc;
|
||||||
Lock _lock;
|
Lock _lock;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
#define _CORE__INCLUDE__PLATFORM_H_
|
#define _CORE__INCLUDE__PLATFORM_H_
|
||||||
|
|
||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <base/sync_allocator.h>
|
#include <base/synced_allocator.h>
|
||||||
#include <base/allocator_avl.h>
|
#include <base/allocator_avl.h>
|
||||||
|
|
||||||
/* Core includes */
|
/* Core includes */
|
||||||
@ -51,7 +51,7 @@ namespace Genode {
|
|||||||
/*
|
/*
|
||||||
* Shortcut for the type of allocator instances for physical resources
|
* Shortcut for the type of allocator instances for physical resources
|
||||||
*/
|
*/
|
||||||
typedef Synchronized_range_allocator<Allocator_avl> Phys_allocator;
|
typedef Synced_range_allocator<Allocator_avl> Phys_allocator;
|
||||||
|
|
||||||
Platform_pd *_core_pd; /* core protection domain object */
|
Platform_pd *_core_pd; /* core protection domain object */
|
||||||
Phys_allocator _ram_alloc; /* RAM allocator */
|
Phys_allocator _ram_alloc; /* RAM allocator */
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <base/allocator_avl.h>
|
#include <base/allocator_avl.h>
|
||||||
#include <base/exception.h>
|
#include <base/exception.h>
|
||||||
#include <base/sync_allocator.h>
|
#include <base/synced_allocator.h>
|
||||||
#include <platform_thread.h>
|
#include <platform_thread.h>
|
||||||
#include <base/thread.h>
|
#include <base/thread.h>
|
||||||
|
|
||||||
|
@ -53,9 +53,9 @@ static const bool verbose_region_alloc = false;
|
|||||||
** Core address space management **
|
** Core address space management **
|
||||||
***********************************/
|
***********************************/
|
||||||
|
|
||||||
static Synchronized_range_allocator<Allocator_avl> &_core_address_ranges()
|
static Synced_range_allocator<Allocator_avl> &_core_address_ranges()
|
||||||
{
|
{
|
||||||
static Synchronized_range_allocator<Allocator_avl> _core_address_ranges(0);
|
static Synced_range_allocator<Allocator_avl> _core_address_ranges(nullptr);
|
||||||
return _core_address_ranges;
|
return _core_address_ranges;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -465,7 +465,7 @@ void Platform::_setup_rom()
|
|||||||
|
|
||||||
|
|
||||||
Platform::Platform() :
|
Platform::Platform() :
|
||||||
_ram_alloc(0), _io_mem_alloc(core_mem_alloc()),
|
_ram_alloc(nullptr), _io_mem_alloc(core_mem_alloc()),
|
||||||
_io_port_alloc(core_mem_alloc()), _irq_alloc(core_mem_alloc()),
|
_io_port_alloc(core_mem_alloc()), _irq_alloc(core_mem_alloc()),
|
||||||
_region_alloc(core_mem_alloc()), _cap_id_alloc(core_mem_alloc()),
|
_region_alloc(core_mem_alloc()), _cap_id_alloc(core_mem_alloc()),
|
||||||
_sigma0(cap_map()->insert(_cap_id_alloc.alloc(), Fiasco::L4_BASE_PAGER_CAP))
|
_sigma0(cap_map()->insert(_cap_id_alloc.alloc(), Fiasco::L4_BASE_PAGER_CAP))
|
||||||
@ -484,13 +484,13 @@ Platform::Platform() :
|
|||||||
_setup_rom();
|
_setup_rom();
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
printf(":ram_alloc: "); _ram_alloc.raw()->dump_addr_tree();
|
printf(":ram_alloc: "); _ram_alloc()->dump_addr_tree();
|
||||||
printf(":region_alloc: "); _region_alloc.raw()->dump_addr_tree();
|
printf(":region_alloc: "); _region_alloc()->dump_addr_tree();
|
||||||
printf(":io_mem: "); _io_mem_alloc.raw()->dump_addr_tree();
|
printf(":io_mem: "); _io_mem_alloc()->dump_addr_tree();
|
||||||
printf(":io_port: "); _io_port_alloc.raw()->dump_addr_tree();
|
printf(":io_port: "); _io_port_alloc()->dump_addr_tree();
|
||||||
printf(":irq: "); _irq_alloc.raw()->dump_addr_tree();
|
printf(":irq: "); _irq_alloc()->dump_addr_tree();
|
||||||
printf(":rom_fs: "); _rom_fs.print_fs();
|
printf(":rom_fs: "); _rom_fs.print_fs();
|
||||||
printf(":core ranges: "); _core_address_ranges().raw()->dump_addr_tree();
|
printf(":core ranges: "); _core_address_ranges()()->dump_addr_tree();
|
||||||
}
|
}
|
||||||
|
|
||||||
Core_cap_index* pdi =
|
Core_cap_index* pdi =
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#define _CORE__INCLUDE__PLATFORM_H_
|
#define _CORE__INCLUDE__PLATFORM_H_
|
||||||
|
|
||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <base/sync_allocator.h>
|
#include <base/synced_allocator.h>
|
||||||
#include <base/allocator_avl.h>
|
#include <base/allocator_avl.h>
|
||||||
#include <irq_session/irq_session.h>
|
#include <irq_session/irq_session.h>
|
||||||
|
|
||||||
@ -46,8 +46,6 @@ namespace Genode {
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
typedef Core_mem_allocator::Phys_allocator Phys_allocator;
|
|
||||||
|
|
||||||
Core_mem_allocator _core_mem_alloc; /* core-accessible memory */
|
Core_mem_allocator _core_mem_alloc; /* core-accessible memory */
|
||||||
Phys_allocator _io_mem_alloc; /* MMIO allocator */
|
Phys_allocator _io_mem_alloc; /* MMIO allocator */
|
||||||
Phys_allocator _io_port_alloc; /* I/O port allocator */
|
Phys_allocator _io_port_alloc; /* I/O port allocator */
|
||||||
|
@ -59,7 +59,7 @@ class Hw::Address_space : public Genode::Address_space
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
friend class Genode::Platform;
|
friend class Genode::Platform;
|
||||||
friend class Genode::Core_mem_allocator::Mapped_mem_allocator;
|
friend class Genode::Mapped_mem_allocator;
|
||||||
|
|
||||||
using Table_allocator =
|
using Table_allocator =
|
||||||
Translation_table_allocator_tpl<DEFAULT_TRANSLATION_TABLE_MAX>;
|
Translation_table_allocator_tpl<DEFAULT_TRANSLATION_TABLE_MAX>;
|
||||||
|
@ -159,23 +159,23 @@ Platform::Platform()
|
|||||||
if (VERBOSE) {
|
if (VERBOSE) {
|
||||||
printf("Core virtual memory allocator\n");
|
printf("Core virtual memory allocator\n");
|
||||||
printf("---------------------\n");
|
printf("---------------------\n");
|
||||||
_core_mem_alloc.virt_alloc()->raw()->dump_addr_tree();
|
(*_core_mem_alloc.virt_alloc())()->dump_addr_tree();
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("RAM memory allocator\n");
|
printf("RAM memory allocator\n");
|
||||||
printf("---------------------\n");
|
printf("---------------------\n");
|
||||||
_core_mem_alloc.phys_alloc()->raw()->dump_addr_tree();
|
(*_core_mem_alloc.phys_alloc())()->dump_addr_tree();
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("IO memory allocator\n");
|
printf("IO memory allocator\n");
|
||||||
printf("-------------------\n");
|
printf("-------------------\n");
|
||||||
_io_mem_alloc.raw()->dump_addr_tree();
|
_io_mem_alloc()->dump_addr_tree();
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("IO port allocator\n");
|
printf("IO port allocator\n");
|
||||||
printf("-------------------\n");
|
printf("-------------------\n");
|
||||||
_io_port_alloc.raw()->dump_addr_tree();
|
_io_port_alloc()->dump_addr_tree();
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("IRQ allocator\n");
|
printf("IRQ allocator\n");
|
||||||
printf("-------------------\n");
|
printf("-------------------\n");
|
||||||
_irq_alloc.raw()->dump_addr_tree();
|
_irq_alloc()->dump_addr_tree();
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("ROM filesystem\n");
|
printf("ROM filesystem\n");
|
||||||
printf("--------------\n");
|
printf("--------------\n");
|
||||||
@ -217,12 +217,10 @@ bool Genode::unmap_local(addr_t virt_addr, size_t num_pages)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Core_mem_allocator::Mapped_mem_allocator::_map_local(addr_t virt_addr,
|
bool Mapped_mem_allocator::_map_local(addr_t virt_addr, addr_t phys_addr,
|
||||||
addr_t phys_addr,
|
|
||||||
unsigned size) {
|
unsigned size) {
|
||||||
return ::map_local(phys_addr, virt_addr, size / get_page_size()); }
|
return ::map_local(phys_addr, virt_addr, size / get_page_size()); }
|
||||||
|
|
||||||
|
|
||||||
bool Core_mem_allocator::Mapped_mem_allocator::_unmap_local(addr_t virt_addr,
|
bool Mapped_mem_allocator::_unmap_local(addr_t virt_addr, unsigned size) {
|
||||||
unsigned size) {
|
|
||||||
return ::unmap_local(virt_addr, size / get_page_size()); }
|
return ::unmap_local(virt_addr, size / get_page_size()); }
|
||||||
|
@ -15,13 +15,13 @@
|
|||||||
#ifndef _CORE__INCLUDE__LINUX__PLATFORM_H_
|
#ifndef _CORE__INCLUDE__LINUX__PLATFORM_H_
|
||||||
#define _CORE__INCLUDE__LINUX__PLATFORM_H_
|
#define _CORE__INCLUDE__LINUX__PLATFORM_H_
|
||||||
|
|
||||||
#include <base/sync_allocator.h>
|
|
||||||
#include <base/allocator_avl.h>
|
#include <base/allocator_avl.h>
|
||||||
#include <base/lock_guard.h>
|
#include <base/lock_guard.h>
|
||||||
|
|
||||||
#include <platform_generic.h>
|
#include <platform_generic.h>
|
||||||
#include <platform_pd.h>
|
#include <platform_pd.h>
|
||||||
#include <platform_thread.h>
|
#include <platform_thread.h>
|
||||||
|
#include <synced_range_allocator.h>
|
||||||
|
|
||||||
namespace Genode {
|
namespace Genode {
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ namespace Genode {
|
|||||||
/**
|
/**
|
||||||
* Allocator for core-internal meta data
|
* Allocator for core-internal meta data
|
||||||
*/
|
*/
|
||||||
Synchronized_range_allocator<Allocator_avl> _core_mem_alloc;
|
Synced_range_allocator<Allocator_avl> _core_mem_alloc;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allocator for pseudo physical memory
|
* Allocator for pseudo physical memory
|
||||||
|
@ -84,7 +84,7 @@ static void sigchld_handler(int signnum)
|
|||||||
|
|
||||||
|
|
||||||
Platform::Platform()
|
Platform::Platform()
|
||||||
: _core_mem_alloc(0)
|
: _core_mem_alloc(nullptr)
|
||||||
{
|
{
|
||||||
/* catch control-c */
|
/* catch control-c */
|
||||||
lx_sigaction(LX_SIGINT, sigint_handler);
|
lx_sigaction(LX_SIGINT, sigint_handler);
|
||||||
|
@ -27,8 +27,6 @@ namespace Genode {
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
typedef Core_mem_allocator::Phys_allocator Phys_allocator;
|
|
||||||
|
|
||||||
Core_mem_allocator _core_mem_alloc; /* core-accessible memory */
|
Core_mem_allocator _core_mem_alloc; /* core-accessible memory */
|
||||||
Phys_allocator _io_mem_alloc; /* MMIO allocator */
|
Phys_allocator _io_mem_alloc; /* MMIO allocator */
|
||||||
Phys_allocator _io_port_alloc; /* I/O port allocator */
|
Phys_allocator _io_port_alloc; /* I/O port allocator */
|
||||||
|
@ -620,9 +620,9 @@ Platform::Platform() :
|
|||||||
_gsi_base_sel = (hip->mem_desc_offset - hip->cpu_desc_offset) / hip->cpu_desc_size;
|
_gsi_base_sel = (hip->mem_desc_offset - hip->cpu_desc_offset) / hip->cpu_desc_size;
|
||||||
|
|
||||||
if (verbose_boot_info) {
|
if (verbose_boot_info) {
|
||||||
printf(":virt_alloc: "); _core_mem_alloc.virt_alloc()->raw()->dump_addr_tree();
|
printf(":virt_alloc: "); (*_core_mem_alloc.virt_alloc())()->dump_addr_tree();
|
||||||
printf(":phys_alloc: "); _core_mem_alloc.phys_alloc()->raw()->dump_addr_tree();
|
printf(":phys_alloc: "); (*_core_mem_alloc.phys_alloc())()->dump_addr_tree();
|
||||||
printf(":io_mem_alloc: "); _io_mem_alloc.raw()->dump_addr_tree();
|
printf(":io_mem_alloc: "); _io_mem_alloc()->dump_addr_tree();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add capability selector ranges to map */
|
/* add capability selector ranges to map */
|
||||||
@ -696,8 +696,7 @@ Platform::Platform() :
|
|||||||
** Support for core memory management **
|
** Support for core memory management **
|
||||||
****************************************/
|
****************************************/
|
||||||
|
|
||||||
bool Core_mem_allocator::Mapped_mem_allocator::_map_local(addr_t virt_addr,
|
bool Mapped_mem_allocator::_map_local(addr_t virt_addr, addr_t phys_addr,
|
||||||
addr_t phys_addr,
|
|
||||||
unsigned size)
|
unsigned size)
|
||||||
{
|
{
|
||||||
map_local((Utcb *)Thread_base::myself()->utcb(), phys_addr,
|
map_local((Utcb *)Thread_base::myself()->utcb(), phys_addr,
|
||||||
@ -707,8 +706,7 @@ bool Core_mem_allocator::Mapped_mem_allocator::_map_local(addr_t virt_addr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Core_mem_allocator::Mapped_mem_allocator::_unmap_local(addr_t virt_addr,
|
bool Mapped_mem_allocator::_unmap_local(addr_t virt_addr, unsigned size)
|
||||||
unsigned size)
|
|
||||||
{
|
{
|
||||||
unmap_local((Utcb *)Thread_base::myself()->utcb(),
|
unmap_local((Utcb *)Thread_base::myself()->utcb(),
|
||||||
virt_addr, size / get_page_size());
|
virt_addr, size / get_page_size());
|
||||||
|
@ -35,7 +35,6 @@ namespace Genode {
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
using Phys_allocator = Core_mem_allocator::Phys_allocator;
|
|
||||||
using Rom_slab = Tslab<Rom_module, get_page_size()>;
|
using Rom_slab = Tslab<Rom_module, get_page_size()>;
|
||||||
using Thread_slab = Tslab<Platform_thread, get_page_size()>;
|
using Thread_slab = Tslab<Platform_thread, get_page_size()>;
|
||||||
|
|
||||||
|
@ -53,14 +53,12 @@ static int num_boot_module_objects;
|
|||||||
** Support for core memory management **
|
** Support for core memory management **
|
||||||
****************************************/
|
****************************************/
|
||||||
|
|
||||||
bool Core_mem_allocator::Mapped_mem_allocator::_map_local(addr_t virt_addr,
|
bool Mapped_mem_allocator::_map_local(addr_t virt_addr, addr_t phys_addr,
|
||||||
addr_t phys_addr,
|
|
||||||
unsigned size) {
|
unsigned size) {
|
||||||
return map_local(phys_addr, virt_addr, size / get_page_size()); }
|
return map_local(phys_addr, virt_addr, size / get_page_size()); }
|
||||||
|
|
||||||
|
|
||||||
bool Core_mem_allocator::Mapped_mem_allocator::_unmap_local(addr_t virt_addr,
|
bool Mapped_mem_allocator::_unmap_local(addr_t virt_addr, unsigned size) {
|
||||||
unsigned size) {
|
|
||||||
return unmap_local(virt_addr, size / get_page_size()); }
|
return unmap_local(virt_addr, size / get_page_size()); }
|
||||||
|
|
||||||
|
|
||||||
@ -284,11 +282,11 @@ Platform::Platform() :
|
|||||||
* hold the meta data for the ROM modules as initialized by '_setup_rom'.
|
* hold the meta data for the ROM modules as initialized by '_setup_rom'.
|
||||||
*/
|
*/
|
||||||
if (verbose_boot_info) {
|
if (verbose_boot_info) {
|
||||||
printf(":phys_alloc: "); _core_mem_alloc.phys_alloc()->raw()->dump_addr_tree();
|
printf(":phys_alloc: "); (*_core_mem_alloc.phys_alloc())()->dump_addr_tree();
|
||||||
printf(":virt_alloc: "); _core_mem_alloc.virt_alloc()->raw()->dump_addr_tree();
|
printf(":virt_alloc: "); (*_core_mem_alloc.virt_alloc())()->dump_addr_tree();
|
||||||
printf(":io_mem: "); _io_mem_alloc.raw()->dump_addr_tree();
|
printf(":io_mem: "); _io_mem_alloc()->dump_addr_tree();
|
||||||
printf(":io_port: "); _io_port_alloc.raw()->dump_addr_tree();
|
printf(":io_port: "); _io_port_alloc()->dump_addr_tree();
|
||||||
printf(":irq: "); _irq_alloc.raw()->dump_addr_tree();
|
printf(":irq: "); _irq_alloc()->dump_addr_tree();
|
||||||
printf(":rom_fs: "); _rom_fs.print_fs();
|
printf(":rom_fs: "); _rom_fs.print_fs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,9 +15,9 @@
|
|||||||
#ifndef _CORE__INCLUDE__PLATFORM_H_
|
#ifndef _CORE__INCLUDE__PLATFORM_H_
|
||||||
#define _CORE__INCLUDE__PLATFORM_H_
|
#define _CORE__INCLUDE__PLATFORM_H_
|
||||||
|
|
||||||
#include <base/sync_allocator.h>
|
|
||||||
#include <base/allocator_avl.h>
|
#include <base/allocator_avl.h>
|
||||||
|
|
||||||
|
#include "synced_range_allocator.h"
|
||||||
#include "platform_generic.h"
|
#include "platform_generic.h"
|
||||||
#include "platform_thread.h"
|
#include "platform_thread.h"
|
||||||
#include "platform_pd.h"
|
#include "platform_pd.h"
|
||||||
@ -33,7 +33,7 @@ namespace Genode {
|
|||||||
/*
|
/*
|
||||||
* Shortcut for the type of allocator instances for physical resources
|
* Shortcut for the type of allocator instances for physical resources
|
||||||
*/
|
*/
|
||||||
typedef Synchronized_range_allocator<Allocator_avl> Phys_allocator;
|
typedef Synced_range_allocator<Allocator_avl> Phys_allocator;
|
||||||
|
|
||||||
Phys_allocator _ram_alloc; /* RAM allocator */
|
Phys_allocator _ram_alloc; /* RAM allocator */
|
||||||
Phys_allocator _io_mem_alloc; /* MMIO allocator */
|
Phys_allocator _io_mem_alloc; /* MMIO allocator */
|
||||||
|
@ -50,9 +50,9 @@ static const bool verbose_region_alloc = false;
|
|||||||
** Core address space management **
|
** Core address space management **
|
||||||
***********************************/
|
***********************************/
|
||||||
|
|
||||||
static Synchronized_range_allocator<Allocator_avl> &_core_address_ranges()
|
static Synced_range_allocator<Allocator_avl> &_core_address_ranges()
|
||||||
{
|
{
|
||||||
static Synchronized_range_allocator<Allocator_avl> _core_address_ranges(0);
|
static Synced_range_allocator<Allocator_avl> _core_address_ranges(nullptr);
|
||||||
return _core_address_ranges;
|
return _core_address_ranges;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -625,7 +625,7 @@ Platform_pd *Platform::core_pd()
|
|||||||
|
|
||||||
|
|
||||||
Platform::Platform() :
|
Platform::Platform() :
|
||||||
_ram_alloc(0), _io_mem_alloc(core_mem_alloc()),
|
_ram_alloc(nullptr), _io_mem_alloc(core_mem_alloc()),
|
||||||
_io_port_alloc(core_mem_alloc()), _irq_alloc(core_mem_alloc()),
|
_io_port_alloc(core_mem_alloc()), _irq_alloc(core_mem_alloc()),
|
||||||
_region_alloc(core_mem_alloc())
|
_region_alloc(core_mem_alloc())
|
||||||
{
|
{
|
||||||
@ -649,13 +649,13 @@ Platform::Platform() :
|
|||||||
* hold the meta data for the ROM modules as initialized by '_setup_rom'.
|
* hold the meta data for the ROM modules as initialized by '_setup_rom'.
|
||||||
*/
|
*/
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
printf(":ram_alloc: "); _ram_alloc.raw()->dump_addr_tree();
|
printf(":ram_alloc: "); _ram_alloc()->dump_addr_tree();
|
||||||
printf(":region_alloc: "); _region_alloc.raw()->dump_addr_tree();
|
printf(":region_alloc: "); _region_alloc()->dump_addr_tree();
|
||||||
printf(":io_mem: "); _io_mem_alloc.raw()->dump_addr_tree();
|
printf(":io_mem: "); _io_mem_alloc()->dump_addr_tree();
|
||||||
printf(":io_port: "); _io_port_alloc.raw()->dump_addr_tree();
|
printf(":io_port: "); _io_port_alloc()->dump_addr_tree();
|
||||||
printf(":irq: "); _irq_alloc.raw()->dump_addr_tree();
|
printf(":irq: "); _irq_alloc()->dump_addr_tree();
|
||||||
printf(":rom_fs: "); _rom_fs.print_fs();
|
printf(":rom_fs: "); _rom_fs.print_fs();
|
||||||
printf(":core ranges: "); _core_address_ranges().raw()->dump_addr_tree();
|
printf(":core ranges: "); _core_address_ranges()()->dump_addr_tree();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include <rm_session/rm_session.h>
|
#include <rm_session/rm_session.h>
|
||||||
#include <ram_session/ram_session.h>
|
#include <ram_session/ram_session.h>
|
||||||
#include <base/printf.h>
|
#include <base/printf.h>
|
||||||
|
#include <base/synced_allocator.h>
|
||||||
#include <base/thread.h>
|
#include <base/thread.h>
|
||||||
|
|
||||||
/* local includes */
|
/* local includes */
|
||||||
@ -42,7 +43,7 @@ class Context_area_rm_session : public Rm_session
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
using Ds_slab = Synchronized_allocator<Tslab<Dataspace_component,
|
using Ds_slab = Synced_allocator<Tslab<Dataspace_component,
|
||||||
get_page_size()> >;
|
get_page_size()> >;
|
||||||
|
|
||||||
Ds_slab _ds_slab { platform()->core_mem_alloc() };
|
Ds_slab _ds_slab { platform()->core_mem_alloc() };
|
||||||
|
@ -30,9 +30,6 @@ class Genode::Platform : public Platform_generic
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
typedef Core_mem_allocator::Phys_allocator Phys_allocator;
|
|
||||||
|
|
||||||
|
|
||||||
Core_mem_allocator _core_mem_alloc; /* core-accessible memory */
|
Core_mem_allocator _core_mem_alloc; /* core-accessible memory */
|
||||||
Phys_allocator _io_mem_alloc; /* MMIO allocator */
|
Phys_allocator _io_mem_alloc; /* MMIO allocator */
|
||||||
Phys_allocator _io_port_alloc; /* I/O port allocator */
|
Phys_allocator _io_port_alloc; /* I/O port allocator */
|
||||||
|
@ -56,8 +56,7 @@ extern int _boot_modules_binaries_end;
|
|||||||
** Support for core memory management **
|
** Support for core memory management **
|
||||||
****************************************/
|
****************************************/
|
||||||
|
|
||||||
bool Core_mem_allocator::Mapped_mem_allocator::_map_local(addr_t virt_addr,
|
bool Mapped_mem_allocator::_map_local(addr_t virt_addr, addr_t phys_addr,
|
||||||
addr_t phys_addr,
|
|
||||||
unsigned size)
|
unsigned size)
|
||||||
{
|
{
|
||||||
size_t const num_pages = size / get_page_size();
|
size_t const num_pages = size / get_page_size();
|
||||||
@ -68,8 +67,7 @@ bool Core_mem_allocator::Mapped_mem_allocator::_map_local(addr_t virt_addr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Core_mem_allocator::Mapped_mem_allocator::_unmap_local(addr_t virt_addr,
|
bool Mapped_mem_allocator::_unmap_local(addr_t virt_addr, unsigned size)
|
||||||
unsigned size)
|
|
||||||
{
|
{
|
||||||
return unmap_local(virt_addr, size / get_page_size());
|
return unmap_local(virt_addr, size / get_page_size());
|
||||||
}
|
}
|
||||||
@ -364,10 +362,10 @@ Platform::Platform()
|
|||||||
printf("VM area at [%08lx,%08lx)\n", _vm_base, _vm_base + _vm_size);
|
printf("VM area at [%08lx,%08lx)\n", _vm_base, _vm_base + _vm_size);
|
||||||
|
|
||||||
if (verbose_boot_info) {
|
if (verbose_boot_info) {
|
||||||
printf(":phys_alloc: "); _core_mem_alloc.phys_alloc()->raw()->dump_addr_tree();
|
printf(":phys_alloc: "); (*_core_mem_alloc.phys_alloc())()->dump_addr_tree();
|
||||||
printf(":unused_phys_alloc:"); _unused_phys_alloc.raw()->dump_addr_tree();
|
printf(":unused_phys_alloc:"); _unused_phys_alloc()->dump_addr_tree();
|
||||||
printf(":virt_alloc: "); _core_mem_alloc.virt_alloc()->raw()->dump_addr_tree();
|
printf(":virt_alloc: "); (*_core_mem_alloc.virt_alloc())()->dump_addr_tree();
|
||||||
printf(":io_mem_alloc: "); _io_mem_alloc.raw()->dump_addr_tree();
|
printf(":io_mem_alloc: "); _io_mem_alloc()->dump_addr_tree();
|
||||||
}
|
}
|
||||||
|
|
||||||
_init_rom_modules();
|
_init_rom_modules();
|
||||||
|
@ -1,261 +0,0 @@
|
|||||||
/*
|
|
||||||
* \brief Lock-guarded allocator interface
|
|
||||||
* \author Norman Feske
|
|
||||||
* \date 2008-08-05
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2008-2013 Genode Labs GmbH
|
|
||||||
*
|
|
||||||
* This file is part of the Genode OS framework, which is distributed
|
|
||||||
* under the terms of the GNU General Public License version 2.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _INCLUDE__BASE__SYNC_ALLOCATOR_H_
|
|
||||||
#define _INCLUDE__BASE__SYNC_ALLOCATOR_H_
|
|
||||||
|
|
||||||
#include <base/allocator.h>
|
|
||||||
#include <base/lock.h>
|
|
||||||
|
|
||||||
namespace Genode {
|
|
||||||
|
|
||||||
template <typename> class Synchronized_allocator;
|
|
||||||
template <typename> class Synchronized_range_allocator;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Lock-guarded allocator
|
|
||||||
*
|
|
||||||
* This class wraps the complete 'Allocator' interface while
|
|
||||||
* preventing concurrent calls to the wrapped allocator implementation.
|
|
||||||
*
|
|
||||||
* \param ALLOCATOR_IMPL class implementing the 'Allocator'
|
|
||||||
* interface
|
|
||||||
*/
|
|
||||||
template <typename ALLOCATOR_IMPL>
|
|
||||||
class Genode::Synchronized_allocator : public Allocator
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
|
|
||||||
Lock _default_lock;
|
|
||||||
Lock *_lock;
|
|
||||||
ALLOCATOR_IMPL _alloc;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* This constructor uses an embedded lock for synchronizing the
|
|
||||||
* access to the allocator.
|
|
||||||
*/
|
|
||||||
Synchronized_allocator()
|
|
||||||
: _lock(&_default_lock) { }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* This constructor uses an embedded lock for synchronizing the
|
|
||||||
* access to the allocator.
|
|
||||||
*/
|
|
||||||
explicit Synchronized_allocator(Allocator *metadata_alloc)
|
|
||||||
: _lock(&_default_lock), _alloc(metadata_alloc) { }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return reference to wrapped (non-thread-safe) allocator
|
|
||||||
*
|
|
||||||
* This is needed, for example, if the wrapped allocator implements
|
|
||||||
* methods in addition to the Range_allocator interface.
|
|
||||||
*/
|
|
||||||
ALLOCATOR_IMPL *raw() { return &_alloc; }
|
|
||||||
|
|
||||||
/*************************
|
|
||||||
** Allocator interface **
|
|
||||||
*************************/
|
|
||||||
|
|
||||||
bool alloc(size_t size, void **out_addr) override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
return _alloc.alloc(size, out_addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void free(void *addr, size_t size) override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
_alloc.free(addr, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t consumed() const override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
return _alloc.consumed();
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t overhead(size_t size) const override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
return _alloc.overhead(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool need_size_for_free() const override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
return _alloc.need_size_for_free();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Lock-guarded range allocator
|
|
||||||
*
|
|
||||||
* This class wraps the complete 'Range_allocator' interface while
|
|
||||||
* preventing concurrent calls to the wrapped allocator implementation.
|
|
||||||
*
|
|
||||||
* \param ALLOCATOR_IMPL class implementing the 'Range_allocator'
|
|
||||||
* interface
|
|
||||||
*/
|
|
||||||
template <typename ALLOCATOR_IMPL>
|
|
||||||
class Genode::Synchronized_range_allocator : public Range_allocator
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
|
|
||||||
Lock _default_lock;
|
|
||||||
Lock *_lock;
|
|
||||||
ALLOCATOR_IMPL _alloc;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* This constructor uses an embedded lock for synchronizing the
|
|
||||||
* access to the allocator.
|
|
||||||
*/
|
|
||||||
Synchronized_range_allocator()
|
|
||||||
: _lock(&_default_lock) { }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* This constructor uses an embedded lock for synchronizing the
|
|
||||||
* access to the allocator.
|
|
||||||
*/
|
|
||||||
explicit Synchronized_range_allocator(Allocator *metadata_alloc)
|
|
||||||
: _lock(&_default_lock), _alloc(metadata_alloc) { }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* \param lock use specified lock rather then an embedded lock for
|
|
||||||
* synchronization
|
|
||||||
*
|
|
||||||
* This constructor is useful if multiple allocators must be
|
|
||||||
* synchronized with each other. In such as case, the shared
|
|
||||||
* lock can be passed to each 'Synchronized_range_allocator'
|
|
||||||
* instance.
|
|
||||||
*/
|
|
||||||
Synchronized_range_allocator(Lock *lock, Allocator *metadata_alloc)
|
|
||||||
: _lock(lock), _alloc(metadata_alloc) { }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return reference to wrapped (non-thread-safe) allocator
|
|
||||||
*
|
|
||||||
* This is needed, for example, if the wrapped allocator implements
|
|
||||||
* methods in addition to the Range_allocator interface.
|
|
||||||
*
|
|
||||||
* NOTE: Synchronize accesses to the raw allocator by facilitating
|
|
||||||
* the lock() method.
|
|
||||||
*/
|
|
||||||
ALLOCATOR_IMPL *raw() { return &_alloc; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return reference to synchronization lock
|
|
||||||
*/
|
|
||||||
Lock *lock() { return _lock; }
|
|
||||||
|
|
||||||
|
|
||||||
/*************************
|
|
||||||
** Allocator interface **
|
|
||||||
*************************/
|
|
||||||
|
|
||||||
bool alloc(size_t size, void **out_addr) override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
return _alloc.alloc(size, out_addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void free(void *addr, size_t size) override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
_alloc.free(addr, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t consumed() const override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
return _alloc.consumed();
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t overhead(size_t size) const override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
return _alloc.overhead(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool need_size_for_free() const override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
return _alloc.need_size_for_free();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************
|
|
||||||
** Range-allocator interface **
|
|
||||||
*******************************/
|
|
||||||
|
|
||||||
int add_range(addr_t base, size_t size) override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
return _alloc.add_range(base, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
int remove_range(addr_t base, size_t size) override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
return _alloc.remove_range(base, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
Alloc_return alloc_aligned(size_t size, void **out_addr, int align = 0,
|
|
||||||
addr_t from = 0, addr_t to = ~0UL) override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
return _alloc.alloc_aligned(size, out_addr, align, from, to);
|
|
||||||
}
|
|
||||||
|
|
||||||
Alloc_return alloc_addr(size_t size, addr_t addr) override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
return _alloc.alloc_addr(size, addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void free(void *addr) override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
_alloc.free(addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t avail() const override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
return _alloc.avail();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool valid_addr(addr_t addr) const override
|
|
||||||
{
|
|
||||||
Lock::Guard lock_guard(*_lock);
|
|
||||||
return _alloc.valid_addr(addr);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* _INCLUDE__BASE__SYNC_ALLOCATOR_H_ */
|
|
75
repos/base/include/base/synced_allocator.h
Normal file
75
repos/base/include/base/synced_allocator.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* \brief Lock-guarded allocator interface
|
||||||
|
* \author Norman Feske
|
||||||
|
* \author Stefan Kalkowski
|
||||||
|
* \date 2008-08-05
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008-2013 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU General Public License version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE__BASE__SYNCED_ALLOCATOR_H_
|
||||||
|
#define _INCLUDE__BASE__SYNCED_ALLOCATOR_H_
|
||||||
|
|
||||||
|
#include <base/allocator.h>
|
||||||
|
#include <base/synced_interface.h>
|
||||||
|
|
||||||
|
namespace Genode {
|
||||||
|
template <typename> class Synced_allocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lock-guarded allocator
|
||||||
|
*
|
||||||
|
* This class wraps the complete 'Allocator' interface while
|
||||||
|
* preventing concurrent calls to the wrapped allocator implementation.
|
||||||
|
*
|
||||||
|
* \param ALLOC class implementing the 'Allocator' interface
|
||||||
|
*/
|
||||||
|
template <typename ALLOC>
|
||||||
|
class Genode::Synced_allocator : public Allocator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
Lock _lock;
|
||||||
|
ALLOC _alloc;
|
||||||
|
Synced_interface<ALLOC, Lock> _synced_object;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
using Guard = typename Synced_interface<ALLOC, Lock>::Guard;
|
||||||
|
|
||||||
|
template <typename... ARGS>
|
||||||
|
Synced_allocator(ARGS &&... args)
|
||||||
|
: _alloc(args...), _synced_object(_lock, &_alloc) { }
|
||||||
|
|
||||||
|
Guard operator () () { return _synced_object(); }
|
||||||
|
Guard operator () () const { return _synced_object(); }
|
||||||
|
|
||||||
|
|
||||||
|
/*************************
|
||||||
|
** Allocator interface **
|
||||||
|
*************************/
|
||||||
|
|
||||||
|
bool alloc(size_t size, void **out_addr) override {
|
||||||
|
return _synced_object()->alloc(size, out_addr); }
|
||||||
|
|
||||||
|
void free(void *addr, size_t size) override {
|
||||||
|
_synced_object()->free(addr, size); }
|
||||||
|
|
||||||
|
size_t consumed() const override {
|
||||||
|
return _synced_object()->consumed(); }
|
||||||
|
|
||||||
|
size_t overhead(size_t size) const override {
|
||||||
|
return _synced_object()->overhead(size); }
|
||||||
|
|
||||||
|
bool need_size_for_free() const override {
|
||||||
|
return _synced_object()->need_size_for_free(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _INCLUDE__BASE__SYNCED_ALLOCATOR_H_ */
|
@ -4,8 +4,8 @@
|
|||||||
* \date 2013-05-16
|
* \date 2013-05-16
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _INCLUDE__OS__SYNCED_INTERFACE_H_
|
#ifndef _INCLUDE__BASE__SYNCED_INTERFACE_H_
|
||||||
#define _INCLUDE__OS__SYNCED_INTERFACE_H_
|
#define _INCLUDE__BASE__SYNCED_INTERFACE_H_
|
||||||
|
|
||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <base/lock.h>
|
#include <base/lock.h>
|
||||||
@ -67,6 +67,11 @@ class Genode::Synced_interface
|
|||||||
{
|
{
|
||||||
return Guard(_lock, _interface);
|
return Guard(_lock, _interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Guard operator () () const
|
||||||
|
{
|
||||||
|
return Guard(_lock, _interface);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _INCLUDE__OS__SYNCED_INTERFACE_H_ */
|
#endif /* _INCLUDE__BASE__SYNCED_INTERFACE_H_ */
|
@ -16,6 +16,7 @@
|
|||||||
#include <rm_session/rm_session.h>
|
#include <rm_session/rm_session.h>
|
||||||
#include <ram_session/ram_session.h>
|
#include <ram_session/ram_session.h>
|
||||||
#include <base/printf.h>
|
#include <base/printf.h>
|
||||||
|
#include <base/synced_allocator.h>
|
||||||
#include <base/thread.h>
|
#include <base/thread.h>
|
||||||
|
|
||||||
/* local includes */
|
/* local includes */
|
||||||
@ -42,7 +43,7 @@ class Context_area_rm_session : public Rm_session
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
using Ds_slab = Synchronized_allocator<Tslab<Dataspace_component,
|
using Ds_slab = Synced_allocator<Tslab<Dataspace_component,
|
||||||
get_page_size()> >;
|
get_page_size()> >;
|
||||||
|
|
||||||
Ds_slab _ds_slab { platform()->core_mem_alloc() };
|
Ds_slab _ds_slab { platform()->core_mem_alloc() };
|
||||||
|
@ -24,7 +24,7 @@ using namespace Genode;
|
|||||||
static const bool verbose_core_mem_alloc = false;
|
static const bool verbose_core_mem_alloc = false;
|
||||||
|
|
||||||
|
|
||||||
void * Core_mem_allocator::Mapped_avl_allocator::map_addr(void * addr)
|
void * Mapped_avl_allocator::map_addr(void * addr)
|
||||||
{
|
{
|
||||||
Block *b = static_cast<Block *>(_find_by_address((addr_t)addr));
|
Block *b = static_cast<Block *>(_find_by_address((addr_t)addr));
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ void * Core_mem_allocator::Mapped_avl_allocator::map_addr(void * addr)
|
|||||||
|
|
||||||
|
|
||||||
Range_allocator::Alloc_return
|
Range_allocator::Alloc_return
|
||||||
Core_mem_allocator::Mapped_mem_allocator::alloc_aligned(size_t size, void **out_addr, int align, addr_t from, addr_t to)
|
Mapped_mem_allocator::alloc_aligned(size_t size, void **out_addr, int align, addr_t from, addr_t to)
|
||||||
{
|
{
|
||||||
size_t page_rounded_size = (size + get_page_size() - 1) & get_page_mask();
|
size_t page_rounded_size = (size + get_page_size() - 1) & get_page_mask();
|
||||||
void *phys_addr = 0;
|
void *phys_addr = 0;
|
||||||
@ -77,7 +77,7 @@ Core_mem_allocator::Mapped_mem_allocator::alloc_aligned(size_t size, void **out_
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Core_mem_allocator::Mapped_mem_allocator::free(void *addr, size_t size)
|
void Mapped_mem_allocator::free(void *addr, size_t size)
|
||||||
{
|
{
|
||||||
using Block = Mapped_avl_allocator::Block;
|
using Block = Mapped_avl_allocator::Block;
|
||||||
Block *b = static_cast<Block *>(_virt_alloc->_find_by_address((addr_t)addr));
|
Block *b = static_cast<Block *>(_virt_alloc->_find_by_address((addr_t)addr));
|
||||||
@ -89,7 +89,7 @@ void Core_mem_allocator::Mapped_mem_allocator::free(void *addr, size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Core_mem_allocator::Mapped_mem_allocator::free(void *addr)
|
void Mapped_mem_allocator::free(void *addr)
|
||||||
{
|
{
|
||||||
PWRN("Not implemented!");
|
PWRN("Not implemented!");
|
||||||
}
|
}
|
||||||
|
@ -16,13 +16,22 @@
|
|||||||
#define _CORE__INCLUDE__CORE_MEM_ALLOC_H_
|
#define _CORE__INCLUDE__CORE_MEM_ALLOC_H_
|
||||||
|
|
||||||
#include <base/lock.h>
|
#include <base/lock.h>
|
||||||
#include <base/sync_allocator.h>
|
|
||||||
#include <base/allocator_avl.h>
|
#include <base/allocator_avl.h>
|
||||||
|
#include <synced_range_allocator.h>
|
||||||
#include <util.h>
|
#include <util.h>
|
||||||
|
|
||||||
namespace Genode {
|
namespace Genode {
|
||||||
class Core_mem_translator;
|
class Core_mem_translator;
|
||||||
class Core_mem_allocator;
|
class Core_mem_allocator;
|
||||||
|
|
||||||
|
struct Metadata;
|
||||||
|
class Mapped_mem_allocator;
|
||||||
|
class Mapped_avl_allocator;
|
||||||
|
|
||||||
|
using Page_allocator = Allocator_avl_tpl<Empty, get_page_size()>;
|
||||||
|
using Phys_allocator = Synced_range_allocator<Page_allocator>;
|
||||||
|
using Synced_mapped_allocator =
|
||||||
|
Synced_range_allocator<Mapped_avl_allocator>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -51,31 +60,17 @@ class Genode::Core_mem_translator : public Genode::Range_allocator
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allocators for physical memory, core's virtual address space,
|
|
||||||
* and core-local memory. The interface of this class is thread safe.
|
|
||||||
* The class itself implements a ready-to-use memory allocator for
|
|
||||||
* core that allows to allocate memory at page granularity only.
|
|
||||||
*/
|
|
||||||
class Genode::Core_mem_allocator : public Genode::Core_mem_translator
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
using Page_allocator = Allocator_avl_tpl<Empty, get_page_size()>;
|
|
||||||
using Phys_allocator = Synchronized_range_allocator<Page_allocator>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Metadata for allocator blocks that stores a related address
|
* Metadata for allocator blocks that stores a related address
|
||||||
*/
|
*/
|
||||||
struct Metadata { void * map_addr; };
|
struct Genode::Metadata { void * map_addr; };
|
||||||
|
|
||||||
class Mapped_mem_allocator;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Page-size granular allocator that links ranges to related ones.
|
* Page-size granular allocator that links ranges to related ones.
|
||||||
*/
|
*/
|
||||||
class Mapped_avl_allocator
|
class Genode::Mapped_avl_allocator
|
||||||
: public Allocator_avl_tpl<Metadata, get_page_size()>
|
: public Genode::Allocator_avl_tpl<Genode::Metadata, Genode::get_page_size()>
|
||||||
{
|
{
|
||||||
friend class Mapped_mem_allocator;
|
friend class Mapped_mem_allocator;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -94,20 +89,18 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator
|
|||||||
* \param addr address within allocated range
|
* \param addr address within allocated range
|
||||||
*/
|
*/
|
||||||
void * map_addr(void * addr);
|
void * map_addr(void * addr);
|
||||||
};
|
};
|
||||||
|
|
||||||
using Synchronized_mapped_allocator =
|
|
||||||
Synchronized_range_allocator<Mapped_avl_allocator>;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unsynchronized allocator for core-mapped memory
|
* Unsynchronized allocator for core-mapped memory
|
||||||
*
|
*
|
||||||
* This is an allocator of core-mapped memory. It is meant to be used as
|
* This is an allocator of core-mapped memory. It is meant to be used as
|
||||||
* meta-data allocator for the other allocators and as back end for core's
|
* meta-data allocator for the other allocators and as back end for core's
|
||||||
* synchronized memory allocator.
|
* synchronized memory allocator.
|
||||||
*/
|
*/
|
||||||
class Mapped_mem_allocator : public Genode::Core_mem_translator
|
class Genode::Mapped_mem_allocator : public Genode::Core_mem_translator
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Mapped_avl_allocator *_phys_alloc;
|
Mapped_avl_allocator *_phys_alloc;
|
||||||
@ -122,9 +115,9 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator
|
|||||||
* \param virt_alloc allocator of core-local virtual memory ranges
|
* \param virt_alloc allocator of core-local virtual memory ranges
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Mapped_mem_allocator(Mapped_avl_allocator *phys_alloc,
|
Mapped_mem_allocator(Synced_mapped_allocator &phys_alloc,
|
||||||
Mapped_avl_allocator *virt_alloc)
|
Synced_mapped_allocator &virt_alloc)
|
||||||
: _phys_alloc(phys_alloc), _virt_alloc(virt_alloc) { }
|
: _phys_alloc(&phys_alloc._alloc), _virt_alloc(&virt_alloc._alloc) { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Establish mapping between physical and virtual address range
|
* Establish mapping between physical and virtual address range
|
||||||
@ -188,7 +181,19 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator
|
|||||||
return _phys_alloc->overhead(size); }
|
return _phys_alloc->overhead(size); }
|
||||||
bool need_size_for_free() const override {
|
bool need_size_for_free() const override {
|
||||||
return _phys_alloc->need_size_for_free(); }
|
return _phys_alloc->need_size_for_free(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocators for physical memory, core's virtual address space,
|
||||||
|
* and core-local memory. The interface of this class is thread safe.
|
||||||
|
* The class itself implements a ready-to-use memory allocator for
|
||||||
|
* core that allows to allocate memory at page granularity only.
|
||||||
|
*/
|
||||||
|
class Genode::Core_mem_allocator : public Genode::Core_mem_translator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
@ -204,7 +209,7 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator
|
|||||||
* This allocator must only be used to allocate memory
|
* This allocator must only be used to allocate memory
|
||||||
* ranges at page granularity.
|
* ranges at page granularity.
|
||||||
*/
|
*/
|
||||||
Synchronized_mapped_allocator _phys_alloc;
|
Synced_mapped_allocator _phys_alloc;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Synchronized allocator of core's virtual memory ranges
|
* Synchronized allocator of core's virtual memory ranges
|
||||||
@ -212,7 +217,7 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator
|
|||||||
* This allocator must only be used to allocate memory
|
* This allocator must only be used to allocate memory
|
||||||
* ranges at page granularity.
|
* ranges at page granularity.
|
||||||
*/
|
*/
|
||||||
Synchronized_mapped_allocator _virt_alloc;
|
Synced_mapped_allocator _virt_alloc;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unsynchronized core-mapped memory allocator
|
* Unsynchronized core-mapped memory allocator
|
||||||
@ -233,24 +238,19 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator
|
|||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
Core_mem_allocator()
|
Core_mem_allocator()
|
||||||
: _phys_alloc(&_lock, &_mem_alloc),
|
: _phys_alloc(_lock, &_mem_alloc),
|
||||||
_virt_alloc(&_lock, &_mem_alloc),
|
_virt_alloc(_lock, &_mem_alloc),
|
||||||
_mem_alloc(_phys_alloc.raw(), _virt_alloc.raw()) { }
|
_mem_alloc(_phys_alloc, _virt_alloc) { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Access physical-memory allocator
|
* Access physical-memory allocator
|
||||||
*/
|
*/
|
||||||
Synchronized_mapped_allocator *phys_alloc() { return &_phys_alloc; }
|
Synced_mapped_allocator *phys_alloc() { return &_phys_alloc; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Access core's virtual-memory allocator
|
* Access core's virtual-memory allocator
|
||||||
*/
|
*/
|
||||||
Synchronized_mapped_allocator *virt_alloc() { return &_virt_alloc; }
|
Synced_mapped_allocator *virt_alloc() { return &_virt_alloc; }
|
||||||
|
|
||||||
/**
|
|
||||||
* Access core's local memory allocator unsynchronized
|
|
||||||
*/
|
|
||||||
Mapped_mem_allocator *raw() { return &_mem_alloc; }
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************
|
/***********************************
|
||||||
@ -259,14 +259,12 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator
|
|||||||
|
|
||||||
void * phys_addr(void * addr)
|
void * phys_addr(void * addr)
|
||||||
{
|
{
|
||||||
Lock::Guard lock_guard(_lock);
|
return _virt_alloc()->map_addr(addr);
|
||||||
return _virt_alloc.raw()->map_addr(addr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void * virt_addr(void * addr)
|
void * virt_addr(void * addr)
|
||||||
{
|
{
|
||||||
Lock::Guard lock_guard(_lock);
|
return _phys_alloc()->map_addr(addr);
|
||||||
return _phys_alloc.raw()->map_addr(addr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
#include <base/tslab.h>
|
#include <base/tslab.h>
|
||||||
#include <base/rpc_server.h>
|
#include <base/rpc_server.h>
|
||||||
#include <base/allocator_guard.h>
|
#include <base/allocator_guard.h>
|
||||||
#include <base/sync_allocator.h>
|
#include <base/synced_allocator.h>
|
||||||
|
|
||||||
/* core includes */
|
/* core includes */
|
||||||
#include <dataspace_component.h>
|
#include <dataspace_component.h>
|
||||||
@ -40,8 +40,7 @@ namespace Genode {
|
|||||||
|
|
||||||
static constexpr size_t SBS = get_page_size();
|
static constexpr size_t SBS = get_page_size();
|
||||||
|
|
||||||
using Ds_slab = Synchronized_allocator<Tslab<Dataspace_component,
|
using Ds_slab = Synced_allocator<Tslab<Dataspace_component, SBS> >;
|
||||||
SBS> >;
|
|
||||||
|
|
||||||
Rpc_entrypoint *_ds_ep;
|
Rpc_entrypoint *_ds_ep;
|
||||||
Rpc_entrypoint *_ram_session_ep;
|
Rpc_entrypoint *_ram_session_ep;
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#include <pager.h>
|
#include <pager.h>
|
||||||
#include <base/allocator_avl.h>
|
#include <base/allocator_avl.h>
|
||||||
#include <base/allocator_guard.h>
|
#include <base/allocator_guard.h>
|
||||||
#include <base/sync_allocator.h>
|
#include <base/synced_allocator.h>
|
||||||
#include <base/signal.h>
|
#include <base/signal.h>
|
||||||
#include <base/rpc_server.h>
|
#include <base/rpc_server.h>
|
||||||
#include <util/list.h>
|
#include <util/list.h>
|
||||||
@ -263,7 +263,7 @@ namespace Genode {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef Synchronized_allocator<Tslab<Rm_client, 1024> > Client_slab_alloc;
|
typedef Synced_allocator<Tslab<Rm_client, 1024> > Client_slab_alloc;
|
||||||
Client_slab_alloc _client_slab; /* backing store for
|
Client_slab_alloc _client_slab; /* backing store for
|
||||||
client structures, synchronized */
|
client structures, synchronized */
|
||||||
Tslab<Rm_region_ref, 1024> _ref_slab; /* backing store for
|
Tslab<Rm_region_ref, 1024> _ref_slab; /* backing store for
|
||||||
|
111
repos/base/src/core/include/synced_range_allocator.h
Normal file
111
repos/base/src/core/include/synced_range_allocator.h
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
/*
|
||||||
|
* \brief Lock-guarded allocator interface
|
||||||
|
* \author Norman Feske
|
||||||
|
* \author Stefan Kalkowski
|
||||||
|
* \date 2008-08-05
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008-2013 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU General Public License version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _SRC__CORE__INCLUDE__SYNCED_RANGE_ALLOCATOR_H_
|
||||||
|
#define _SRC__CORE__INCLUDE__SYNCED_RANGE_ALLOCATOR_H_
|
||||||
|
|
||||||
|
#include <base/allocator.h>
|
||||||
|
#include <base/synced_interface.h>
|
||||||
|
|
||||||
|
namespace Genode {
|
||||||
|
class Mapped_mem_allocator;
|
||||||
|
template <typename> class Synced_range_allocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lock-guarded range allocator
|
||||||
|
*
|
||||||
|
* This class wraps the complete 'Range_allocator' interface while
|
||||||
|
* preventing concurrent calls to the wrapped allocator implementation.
|
||||||
|
*
|
||||||
|
* \param ALLOC class implementing the 'Range_allocator' interface
|
||||||
|
*/
|
||||||
|
template <typename ALLOC>
|
||||||
|
class Genode::Synced_range_allocator : public Range_allocator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
friend class Mapped_mem_allocator;
|
||||||
|
|
||||||
|
Lock _default_lock;
|
||||||
|
Lock &_lock;
|
||||||
|
ALLOC _alloc;
|
||||||
|
Synced_interface<ALLOC, Lock> _synced_object;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
using Guard = typename Synced_interface<ALLOC, Lock>::Guard;
|
||||||
|
|
||||||
|
template <typename... ARGS>
|
||||||
|
Synced_range_allocator(Lock &lock, ARGS &&... args)
|
||||||
|
: _lock(lock), _alloc(args...), _synced_object(_lock, &_alloc) { }
|
||||||
|
|
||||||
|
template <typename... ARGS>
|
||||||
|
Synced_range_allocator(ARGS &&... args)
|
||||||
|
: _lock(_default_lock), _alloc(args...),
|
||||||
|
_synced_object(_lock, &_alloc) { }
|
||||||
|
|
||||||
|
Guard operator () () { return _synced_object(); }
|
||||||
|
Guard operator () () const { return _synced_object(); }
|
||||||
|
|
||||||
|
|
||||||
|
/*************************
|
||||||
|
** Allocator interface **
|
||||||
|
*************************/
|
||||||
|
|
||||||
|
bool alloc(size_t size, void **out_addr) override {
|
||||||
|
return _synced_object()->alloc(size, out_addr); }
|
||||||
|
|
||||||
|
void free(void *addr, size_t size) override {
|
||||||
|
_synced_object()->free(addr, size); }
|
||||||
|
|
||||||
|
size_t consumed() const override {
|
||||||
|
return _synced_object()->consumed(); }
|
||||||
|
|
||||||
|
size_t overhead(size_t size) const override {
|
||||||
|
return _synced_object()->overhead(size); }
|
||||||
|
|
||||||
|
bool need_size_for_free() const override {
|
||||||
|
return _synced_object()->need_size_for_free(); }
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************
|
||||||
|
** Range-allocator interface **
|
||||||
|
*******************************/
|
||||||
|
|
||||||
|
int add_range(addr_t base, size_t size) override {
|
||||||
|
return _synced_object()->add_range(base, size); }
|
||||||
|
|
||||||
|
int remove_range(addr_t base, size_t size) override {
|
||||||
|
return _synced_object()->remove_range(base, size); }
|
||||||
|
|
||||||
|
Alloc_return alloc_aligned(size_t size, void **out_addr, int align = 0,
|
||||||
|
addr_t from = 0, addr_t to = ~0UL) override {
|
||||||
|
return _synced_object()->alloc_aligned(size, out_addr, align, from, to); }
|
||||||
|
|
||||||
|
Alloc_return alloc_addr(size_t size, addr_t addr) override {
|
||||||
|
return _synced_object()->alloc_addr(size, addr); }
|
||||||
|
|
||||||
|
void free(void *addr) override {
|
||||||
|
_synced_object()->free(addr); }
|
||||||
|
|
||||||
|
size_t avail() const override {
|
||||||
|
return _synced_object()->avail(); }
|
||||||
|
|
||||||
|
bool valid_addr(addr_t addr) const override {
|
||||||
|
return _synced_object()->valid_addr(addr); }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _SRC__CORE__INCLUDE__SYNCED_RANGE_ALLOCATOR_H_ */
|
@ -291,7 +291,7 @@ Ram_session_component::Ram_session_component(Rpc_entrypoint *ds_ep,
|
|||||||
Ram_session_component::~Ram_session_component()
|
Ram_session_component::~Ram_session_component()
|
||||||
{
|
{
|
||||||
/* destroy all dataspaces */
|
/* destroy all dataspaces */
|
||||||
for (Dataspace_component *ds; (ds = _ds_slab.raw()->first_object()); _free_ds(ds));
|
for (Dataspace_component *ds; (ds = _ds_slab()->first_object()); _free_ds(ds));
|
||||||
|
|
||||||
if (_payload != 0)
|
if (_payload != 0)
|
||||||
PWRN("Remaining payload of %zu in ram session to destroy", _payload);
|
PWRN("Remaining payload of %zu in ram session to destroy", _payload);
|
||||||
|
@ -754,7 +754,7 @@ Rm_session_component::~Rm_session_component()
|
|||||||
faulter->dissolve_from_faulting_rm_session(this);
|
faulter->dissolve_from_faulting_rm_session(this);
|
||||||
|
|
||||||
/* remove all clients, invalidate rm_client pointers in cpu_thread objects */
|
/* remove all clients, invalidate rm_client pointers in cpu_thread objects */
|
||||||
while (Rm_client *cl = _client_slab.raw()->first_object()) {
|
while (Rm_client *cl = _client_slab()->first_object()) {
|
||||||
cl->dissolve_from_faulting_rm_session(this);
|
cl->dissolve_from_faulting_rm_session(this);
|
||||||
|
|
||||||
Thread_capability thread_cap = cl->thread_cap();
|
Thread_capability thread_cap = cl->thread_cap();
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <os/synced_interface.h>
|
#include <base/synced_interface.h>
|
||||||
#include <base/printf.h>
|
#include <base/printf.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
#include <base/thread.h>
|
#include <base/thread.h>
|
||||||
#include <block_session/connection.h>
|
#include <block_session/connection.h>
|
||||||
#include <util/string.h>
|
#include <util/string.h>
|
||||||
#include <base/sync_allocator.h>
|
#include <base/synced_allocator.h>
|
||||||
|
|
||||||
/* local includes */
|
/* local includes */
|
||||||
#include "synced_motherboard.h"
|
#include "synced_motherboard.h"
|
||||||
@ -100,17 +100,17 @@ class Vancouver_disk : public Genode::Thread<8192>, public StaticReceiver<Vancou
|
|||||||
|
|
||||||
/* slabs for temporary holding DMADescriptor and MessageDisk objects */
|
/* slabs for temporary holding DMADescriptor and MessageDisk objects */
|
||||||
typedef Genode::Tslab<MessageDisk, 128> MessageDisk_Slab;
|
typedef Genode::Tslab<MessageDisk, 128> MessageDisk_Slab;
|
||||||
typedef Genode::Synchronized_allocator<MessageDisk_Slab> MessageDisk_Slab_Sync;
|
typedef Genode::Synced_allocator<MessageDisk_Slab> MessageDisk_Slab_Sync;
|
||||||
|
|
||||||
typedef Genode::Tslab<DmaDescriptor, 256> DmaDesc_Slab;
|
typedef Genode::Tslab<DmaDescriptor, 256> DmaDesc_Slab;
|
||||||
typedef Genode::Synchronized_allocator<DmaDesc_Slab> DmaDesc_Slab_Sync;
|
typedef Genode::Synced_allocator<DmaDesc_Slab> DmaDesc_Slab_Sync;
|
||||||
|
|
||||||
MessageDisk_Slab_Sync _tslab_msg;
|
MessageDisk_Slab_Sync _tslab_msg;
|
||||||
DmaDesc_Slab_Sync _tslab_dma;
|
DmaDesc_Slab_Sync _tslab_dma;
|
||||||
|
|
||||||
/* Structure to find back the MessageDisk object out of a Block Ack */
|
/* Structure to find back the MessageDisk object out of a Block Ack */
|
||||||
typedef Genode::Tslab<Avl_entry, 128> Avl_entry_slab;
|
typedef Genode::Tslab<Avl_entry, 128> Avl_entry_slab;
|
||||||
typedef Genode::Synchronized_allocator<Avl_entry_slab> Avl_entry_slab_sync;
|
typedef Genode::Synced_allocator<Avl_entry_slab> Avl_entry_slab_sync;
|
||||||
|
|
||||||
Avl_entry_slab_sync _tslab_avl;
|
Avl_entry_slab_sync _tslab_avl;
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
#include <nic/packet_allocator.h>
|
#include <nic/packet_allocator.h>
|
||||||
#include <os/config.h>
|
#include <os/config.h>
|
||||||
#include <os/alarm.h>
|
#include <os/alarm.h>
|
||||||
#include <os/synced_interface.h>
|
#include <base/synced_interface.h>
|
||||||
#include <timer_session/connection.h>
|
#include <timer_session/connection.h>
|
||||||
#include <rtc_session/connection.h>
|
#include <rtc_session/connection.h>
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#define _SYNCED_MOTHERBOARD_H_
|
#define _SYNCED_MOTHERBOARD_H_
|
||||||
|
|
||||||
#include <nul/motherboard.h>
|
#include <nul/motherboard.h>
|
||||||
#include <os/synced_interface.h>
|
#include <base/synced_interface.h>
|
||||||
|
|
||||||
typedef Genode::Synced_interface<Motherboard> Synced_motherboard;
|
typedef Genode::Synced_interface<Motherboard> Synced_motherboard;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user