From a96130f20bfc1bd31f1262912e0de9cef28aa54e Mon Sep 17 00:00:00 2001
From: Martin Stein <martin.stein@genode-labs.com>
Date: Mon, 18 Apr 2016 16:01:41 +0200
Subject: [PATCH] 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
---
 repos/base/include/base/allocator.h                  |  2 +-
 repos/base/include/base/allocator_avl.h              | 11 +++++++----
 repos/base/src/core/include/core_mem_alloc.h         |  8 ++++----
 repos/base/src/core/include/synced_range_allocator.h |  2 +-
 4 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/repos/base/include/base/allocator.h b/repos/base/include/base/allocator.h
index 17729af42f..8e30fae253 100644
--- a/repos/base/include/base/allocator.h
+++ b/repos/base/include/base/allocator.h
@@ -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
diff --git a/repos/base/include/base/allocator_avl.h b/repos/base/include/base/allocator_avl.h
index 2b7fab37de..376b90f18f 100644
--- a/repos/base/include/base/allocator_avl.h
+++ b/repos/base/include/base/allocator_avl.h
@@ -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); }
 
diff --git a/repos/base/src/core/include/core_mem_alloc.h b/repos/base/src/core/include/core_mem_alloc.h
index ceedc335aa..25d5eda827 100644
--- a/repos/base/src/core/include/core_mem_alloc.h
+++ b/repos/base/src/core/include/core_mem_alloc.h
@@ -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
 		{
diff --git a/repos/base/src/core/include/synced_range_allocator.h b/repos/base/src/core/include/synced_range_allocator.h
index df84c3cd81..c3ec4b978c 100644
--- a/repos/base/src/core/include/synced_range_allocator.h
+++ b/repos/base/src/core/include/synced_range_allocator.h
@@ -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); }