diff --git a/base-nova/src/base/env/cap_sel_alloc.cc b/base-nova/src/base/env/cap_sel_alloc.cc deleted file mode 100644 index bf496d8cf5..0000000000 --- a/base-nova/src/base/env/cap_sel_alloc.cc +++ /dev/null @@ -1,71 +0,0 @@ -/* - * \brief Capability-selector allocator - * \author Norman Feske - * \author Sebastian Sumpf - * \author Alexander Boettcher - * \date 2010-01-19 - * - * This is a NOVA-specific addition to the process environment. - */ - -/* - * Copyright (C) 2010-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. - */ - -/* Genode includes */ -#include - -/* NOVA includes */ -#include -#include - -using namespace Genode; - -/** - * Return lock used to protect capability selector allocations - */ -static Genode::Lock &alloc_lock() -{ - static Genode::Lock alloc_lock_inst; - return alloc_lock_inst; -} - - -addr_t Cap_selector_allocator::alloc(size_t num_caps_log2) -{ - Lock::Guard guard(alloc_lock()); - return Bit_allocator::alloc(num_caps_log2); -} - - -void Cap_selector_allocator::free(addr_t cap, size_t num_caps_log2) -{ - Lock::Guard guard(alloc_lock()); - Bit_allocator::free(cap, num_caps_log2); -} - - -Cap_selector_allocator::Cap_selector_allocator() : Bit_allocator() -{ - /* initialize lock */ - alloc_lock(); - - /** - * The first selectors are reserved for exception portals and special - * purpose usage as defined in the nova syscall header file - */ - Bit_allocator::_reserve(0, Nova::NUM_INITIAL_PT_RESERVED); -} - - -namespace Genode { - - Cap_selector_allocator *cap_selector_allocator() - { - static Cap_selector_allocator inst; - return &inst; - } -} diff --git a/base-nova/include/base/bit_allocator.h b/base/include/util/bit_allocator.h similarity index 56% rename from base-nova/include/base/bit_allocator.h rename to base/include/util/bit_allocator.h index 71e62b1ffa..d97ea8bbc7 100644 --- a/base-nova/include/base/bit_allocator.h +++ b/base/include/util/bit_allocator.h @@ -1,6 +1,7 @@ /* - * \brief Allocator using bitmaps to maintain cap space + * \brief Allocator using bitmaps * \author Alexander Boettcher + * \author Stefan Kalkowski * \date 2012-06-14 */ @@ -11,41 +12,41 @@ * under the terms of the GNU General Public License version 2. */ -#ifndef _INCLUDE__BASE__BIT_ALLOCATOR_H_ -#define _INCLUDE__BASE__BIT_ALLOCATOR_H_ +#ifndef _INCLUDE__UTIL__BIT_ALLOCATOR_H_ +#define _INCLUDE__UTIL__BIT_ALLOCATOR_H_ -#include +#include namespace Genode { - template + template class Bit_allocator { protected: - addr_t _next; - Bit_array _array; + addr_t _next; + Bit_array _array; - void _reserve(addr_t bit_start, size_t const num_cap) + void _reserve(addr_t bit_start, size_t const num) { - if (!num_cap) return; + if (!num) return; - _array.set(bit_start, num_cap); + _array.set(bit_start, num); } public: + class Out_of_indices : Exception {}; + Bit_allocator() : _next(0) { } - addr_t alloc(size_t const num_log2) + addr_t alloc(size_t const num_log2 = 0) { addr_t const step = 1UL << num_log2; addr_t max = ~0UL; - do - { - try - { + do { + try { /* throws exception if array is accessed outside bounds */ for (addr_t i = _next & ~(step - 1); i < max; i += step) { if (_array.get(i, step)) @@ -55,22 +56,21 @@ namespace Genode { _next = i + step; return i; } - } catch (Bit_array_invalid_index_access) { } + } catch (typename Bit_array::Invalid_index_access) { } max = _next; _next = 0; } while (max != 0); - throw Bit_array_out_of_indexes(); + throw Out_of_indices(); } - void free(addr_t const bit_start, size_t const num_log2) + void free(addr_t const bit_start, size_t const num_log2 = 0) { _array.clear(bit_start, 1UL << num_log2); _next = bit_start; } - }; } -#endif /* _INCLUDE__BASE__BIT_ALLOCATOR_H_ */ +#endif /* _INCLUDE__UTIL__BIT_ALLOCATOR_H_ */ diff --git a/base-nova/include/base/bit_array.h b/base/include/util/bit_array.h similarity index 53% rename from base-nova/include/base/bit_array.h rename to base/include/util/bit_array.h index 3756369a4a..e49a466f77 100644 --- a/base-nova/include/base/bit_array.h +++ b/base/include/util/bit_array.h @@ -1,6 +1,7 @@ /* - * \brief Allocator using bitmaps to maintain cap space + * \brief Allocator using bitmaps * \author Alexander Boettcher + * \author Stefan Kalkowski * \date 2012-06-14 */ @@ -11,42 +12,45 @@ * under the terms of the GNU General Public License version 2. */ -#ifndef _INCLUDE__BASE__BIT_ARRAY_H_ -#define _INCLUDE__BASE__BIT_ARRAY_H_ +#ifndef _INCLUDE__UTIL__BIT_ARRAY_H_ +#define _INCLUDE__UTIL__BIT_ARRAY_H_ +#include #include namespace Genode { - class Bit_array_invalid_index_access{}; - class Bit_array_invalid_clear{}; - class Bit_array_invalid_set{}; - class Bit_array_out_of_indexes{}; - - template + template class Bit_array { + public: + + class Invalid_index_access : public Exception {}; + class Invalid_clear : public Exception {}; + class Invalid_set : public Exception {}; + private: - enum { - _BITS_PER_BYTE = 8UL, - _BITS_PER_WORD = sizeof(addr_t) * _BITS_PER_BYTE, - }; + static constexpr size_t _BITS_PER_BYTE = 8UL; + static constexpr size_t _BITS_PER_WORD = sizeof(addr_t) * + _BITS_PER_BYTE; + static constexpr size_t _WORDS = BITS / _BITS_PER_WORD; - addr_t _words[WORDS]; + static_assert(BITS % _BITS_PER_WORD == 0, + "Count of bits need to be word aligned!"); - addr_t _word(addr_t index) const - { - return index / _BITS_PER_WORD; - } + addr_t _words[_WORDS]; + + addr_t _word(addr_t index) const { + return index / _BITS_PER_WORD; } void _check_range(addr_t const index, addr_t const width) const { - if ((index >= WORDS * _BITS_PER_WORD) || - width > WORDS * _BITS_PER_WORD || - WORDS * _BITS_PER_WORD - width < index) - throw Bit_array_invalid_index_access(); + if ((index >= _WORDS * _BITS_PER_WORD) || + width > _WORDS * _BITS_PER_WORD || + _WORDS * _BITS_PER_WORD - width < index) + throw Invalid_index_access(); } addr_t _mask(addr_t const index, addr_t const width, @@ -57,11 +61,8 @@ namespace Genode { rest = width + shift > _BITS_PER_WORD ? width + shift - _BITS_PER_WORD : 0; - if (width >= _BITS_PER_WORD) - return ~0UL << shift; - else - return ((1UL << width) - 1) << shift; - + return (width >= _BITS_PER_WORD) ? ~0UL << shift + : ((1UL << width) - 1) << shift; } void _set(addr_t index, addr_t width, bool free) @@ -75,26 +76,22 @@ namespace Genode { if (free) { if ((_words[word] & mask) != mask) - throw Bit_array_invalid_clear(); + throw Invalid_clear(); _words[word] &= ~mask; } else { if (_words[word] & mask) - throw Bit_array_invalid_set(); + throw Invalid_set(); _words[word] |= mask; } index = (_word(index) + 1) * _BITS_PER_WORD; width = rest; - } while (rest); } public: - Bit_array() - { - for (addr_t i = 0; i < WORDS; i++) _words[i] = 0UL; - } + Bit_array() { memset(&_words, 0, sizeof(_words)); } /** * Return true if at least one bit is set between @@ -116,16 +113,12 @@ namespace Genode { return used; } - void set(addr_t const index, addr_t const width) - { - _set(index, width, false); - } + void set(addr_t const index, addr_t const width) { + _set(index, width, false); } - void clear(addr_t const index, addr_t const width) - { - _set(index, width, true); - } + void clear(addr_t const index, addr_t const width) { + _set(index, width, true); } }; } -#endif /* _INCLUDE__BASE__BIT_ARRAY_H_ */ +#endif /* _INCLUDE__UTIL__BIT_ARRAY_H_ */