mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-07 19:34:56 +00:00
base: get rid of alloc align default value
When using the Allocator interface, one can't tell which alignment resulting allocations fulfill. However, at least on ARM, given the architectural alignment requirements of ARM memory accesses, one wants memory allocations (what allocators are for in most cases) to be word aligned automatically. Previously, at least the AVL allocator simply called alloc_aligned without defining align in its alloc implementation. This led to unaligned access faults (the default was 0) when using the AVL allocator as Allocator (as done in the metadata management of a SLAB of an AVL that uses the AVL as backing store). To avoid such pitfalls in the future, we force users of alloc_aligned to always specify align (why use alloc_aligned without align anyway). Ref #1941
This commit is contained in:
parent
cdf57b60f9
commit
a96130f20b
@ -163,7 +163,7 @@ struct Genode::Range_allocator : Allocator
|
||||
* \param align alignment of new block specified
|
||||
* as the power of two
|
||||
*/
|
||||
virtual Alloc_return alloc_aligned(size_t size, void **out_addr, int align = 0, addr_t from=0, addr_t to = ~0UL) = 0;
|
||||
virtual Alloc_return alloc_aligned(size_t size, void **out_addr, int align, addr_t from=0, addr_t to = ~0UL) = 0;
|
||||
|
||||
/**
|
||||
* Allocate block at address
|
||||
|
@ -131,7 +131,7 @@ class Genode::Allocator_avl_base : public Range_allocator
|
||||
/**
|
||||
* Find best-fitting block
|
||||
*/
|
||||
Block *find_best_fit(size_t size, unsigned align = 1,
|
||||
Block *find_best_fit(size_t size, unsigned align,
|
||||
addr_t from = 0UL, addr_t to = ~0UL);
|
||||
|
||||
/**
|
||||
@ -260,7 +260,7 @@ class Genode::Allocator_avl_base : public Range_allocator
|
||||
|
||||
int add_range(addr_t base, size_t size) override;
|
||||
int remove_range(addr_t base, size_t size) override;
|
||||
Alloc_return alloc_aligned(size_t size, void **out_addr, int align = 0,
|
||||
Alloc_return alloc_aligned(size_t size, void **out_addr, int align,
|
||||
addr_t from = 0, addr_t to = ~0UL) override;
|
||||
Alloc_return alloc_addr(size_t size, addr_t addr) override;
|
||||
void free(void *addr) override;
|
||||
@ -272,8 +272,11 @@ class Genode::Allocator_avl_base : public Range_allocator
|
||||
** Allocator interface **
|
||||
*************************/
|
||||
|
||||
bool alloc(size_t size, void **out_addr) override {
|
||||
return (Allocator_avl_base::alloc_aligned(size, out_addr).is_ok()); }
|
||||
bool alloc(size_t size, void **out_addr) override
|
||||
{
|
||||
return (Allocator_avl_base::alloc_aligned(
|
||||
size, out_addr, log2(sizeof(addr_t))).is_ok());
|
||||
}
|
||||
|
||||
void free(void *addr, size_t) override { free(addr); }
|
||||
|
||||
|
@ -159,7 +159,7 @@ class Genode::Mapped_mem_allocator : public Genode::Core_mem_translator
|
||||
int add_range(addr_t base, size_t size) override { return -1; }
|
||||
int remove_range(addr_t base, size_t size) override { return -1; }
|
||||
Alloc_return alloc_aligned(size_t size, void **out_addr,
|
||||
int align = 0, addr_t from = 0,
|
||||
int align, addr_t from = 0,
|
||||
addr_t to = ~0UL) override;
|
||||
Alloc_return alloc_addr(size_t size, addr_t addr) override {
|
||||
return Alloc_return::RANGE_CONFLICT; }
|
||||
@ -174,7 +174,7 @@ class Genode::Mapped_mem_allocator : public Genode::Core_mem_translator
|
||||
*************************/
|
||||
|
||||
bool alloc(size_t size, void **out_addr) override {
|
||||
return alloc_aligned(size, out_addr).is_ok(); }
|
||||
return alloc_aligned(size, out_addr, log2(sizeof(addr_t))).is_ok(); }
|
||||
void free(void *addr, size_t) override;
|
||||
size_t consumed() const override { return _phys_alloc->consumed(); }
|
||||
size_t overhead(size_t size) const override {
|
||||
@ -277,7 +277,7 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator
|
||||
Alloc_return alloc_addr(size_t size, addr_t addr) override {
|
||||
return Alloc_return::RANGE_CONFLICT; }
|
||||
|
||||
Alloc_return alloc_aligned(size_t size, void **out_addr, int align = 0,
|
||||
Alloc_return alloc_aligned(size_t size, void **out_addr, int align,
|
||||
addr_t from = 0, addr_t to = ~0UL) override
|
||||
{
|
||||
Lock::Guard lock_guard(_lock);
|
||||
@ -300,7 +300,7 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator
|
||||
*************************/
|
||||
|
||||
bool alloc(size_t size, void **out_addr) override {
|
||||
return alloc_aligned(size, out_addr).is_ok(); }
|
||||
return alloc_aligned(size, out_addr, log2(sizeof(addr_t))).is_ok(); }
|
||||
|
||||
void free(void *addr, size_t size) override
|
||||
{
|
||||
|
@ -91,7 +91,7 @@ class Genode::Synced_range_allocator : public Range_allocator
|
||||
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,
|
||||
Alloc_return alloc_aligned(size_t size, void **out_addr, int align,
|
||||
addr_t from = 0, addr_t to = ~0UL) override {
|
||||
return _synced_object()->alloc_aligned(size, out_addr, align, from, to); }
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user