From a850d040ab99b4d6c66a40adc86778c849f74ebe Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 28 Jan 2014 11:32:35 +0100 Subject: [PATCH] score: Add _Workspace_Allocate_aligned() --- cpukit/score/include/rtems/score/wkspace.h | 11 +++++++++++ cpukit/score/src/wkspace.c | 5 +++++ testsuites/sptests/spwkspace/init.c | 14 ++++++++++++++ testsuites/sptests/spwkspace/spwkspace.doc | 2 ++ testsuites/sptests/spwkspace/spwkspace.scn | 2 ++ 5 files changed, 34 insertions(+) diff --git a/cpukit/score/include/rtems/score/wkspace.h b/cpukit/score/include/rtems/score/wkspace.h index 7adf9dff07..ea8ad856ac 100644 --- a/cpukit/score/include/rtems/score/wkspace.h +++ b/cpukit/score/include/rtems/score/wkspace.h @@ -71,6 +71,17 @@ void *_Workspace_Allocate( size_t size ); +/** + * @brief Allocate aligned memory from workspace. + * + * @param[in] size The size of the requested memory. + * @param[in] alignment The alignment of the requested memory. + * + * @retval NULL Not enough resources. + * @retval other The memory area begin. + */ +void *_Workspace_Allocate_aligned( size_t size, size_t alignment ); + /** * @brief Free memory to the workspace. * diff --git a/cpukit/score/src/wkspace.c b/cpukit/score/src/wkspace.c index b9482960ac..65806863c2 100644 --- a/cpukit/score/src/wkspace.c +++ b/cpukit/score/src/wkspace.c @@ -114,6 +114,11 @@ void *_Workspace_Allocate( return memory; } +void *_Workspace_Allocate_aligned( size_t size, size_t alignment ) +{ + return _Heap_Allocate_aligned( &_Workspace_Area, size, alignment ); +} + /* * _Workspace_Free */ diff --git a/testsuites/sptests/spwkspace/init.c b/testsuites/sptests/spwkspace/init.c index 1441662bf6..f6102e2159 100644 --- a/testsuites/sptests/spwkspace/init.c +++ b/testsuites/sptests/spwkspace/init.c @@ -54,6 +54,17 @@ static void test_workspace_string_duplicate(void) _Workspace_Free( dup_e ); } +static void test_workspace_allocate_aligned(void) +{ + uintptr_t align = 512; + void *p = _Workspace_Allocate_aligned( 1, align ); + + rtems_test_assert( p != NULL ); + rtems_test_assert( ((uintptr_t) p & (align - 1)) == 0 ); + + _Workspace_Free( p ); +} + rtems_task Init( rtems_task_argument argument ) @@ -100,6 +111,9 @@ rtems_task Init( puts( "_Workspace_String_duplicate - samples" ); test_workspace_string_duplicate(); + puts( "_Workspace_Allocate_aligned" ); + test_workspace_allocate_aligned(); + puts( "*** END OF TEST WORKSPACE CLASSIC API ***" ); rtems_test_exit( 0 ); } diff --git a/testsuites/sptests/spwkspace/spwkspace.doc b/testsuites/sptests/spwkspace/spwkspace.doc index 3b03781ab7..dcd4e7a12d 100644 --- a/testsuites/sptests/spwkspace/spwkspace.doc +++ b/testsuites/sptests/spwkspace/spwkspace.doc @@ -15,6 +15,8 @@ directives: rtems_workspace_get_information rtems_workspace_allocate rtems_workspace_free + _Workspace_String_duplicate + _Workspace_Allocate_aligned concepts: diff --git a/testsuites/sptests/spwkspace/spwkspace.scn b/testsuites/sptests/spwkspace/spwkspace.scn index 0fe8088abf..6431923f84 100644 --- a/testsuites/sptests/spwkspace/spwkspace.scn +++ b/testsuites/sptests/spwkspace/spwkspace.scn @@ -7,4 +7,6 @@ rtems_workspace_allocate - too many bytes rtems_workspace_allocate - 42 bytes rtems_workspace_free - NULL rtems_workspace_free - previous pointer to 42 bytes +_Workspace_String_duplicate - samples +_Workspace_Allocate_aligned *** END OF TEST WORKSPACE CLASSIC API ***