File indexing completed on 2025-05-11 08:24:40
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #ifdef HAVE_CONFIG_H
0030 #include "config.h"
0031 #endif
0032
0033 #include <tmacros.h>
0034 #include "test_support.h"
0035
0036 #include <errno.h>
0037 #include <pthread.h>
0038 #include <sched.h>
0039
0040 #include <rtems/posix/pthreadimpl.h>
0041 #include <rtems/score/stackimpl.h>
0042
0043 const char rtems_test_name[] = "PSXSTACK 2";
0044
0045
0046 void *POSIX_Init(void *argument);
0047 void *Test_Thread(void *arg);
0048
0049 void *Stack_Low;
0050 void *Stack_High;
0051
0052 void *Test_Thread(void *arg)
0053 {
0054 #if defined(__GNUC__)
0055 void *sp = __builtin_frame_address(0);
0056
0057 #if 0
0058 printf( "Stack(%p - %p) and sp=%p\n", Stack_Low, Stack_High, sp );
0059 #endif
0060
0061 if ( sp >= Stack_Low && sp <= Stack_High )
0062 puts( "Test_Thread - running on user provided stack - OK" );
0063 else {
0064 puts( "Test_Thread - ERROR running on other stack" );
0065 rtems_test_exit(0);
0066 }
0067 #else
0068 puts( "Test_Thread - no way to get stack pointer and verify" );
0069 #endif
0070 puts( "Test_Thread - delete self" );
0071 return NULL;
0072 }
0073
0074 void *POSIX_Init(void *argument)
0075 {
0076 int sc;
0077 pthread_t id;
0078 pthread_attr_t attr;
0079 struct timespec delay_request;
0080
0081 TEST_BEGIN();
0082
0083 puts( "Init - Allocate stack from heap" );
0084 Stack_Low = malloc(PTHREAD_MINIMUM_STACK_SIZE);
0085 rtems_test_assert( Stack_Low );
0086 Stack_High = Stack_Low + PTHREAD_MINIMUM_STACK_SIZE;
0087
0088 puts( "Init - Initialize thread attribute for user provided stack" );
0089 sc = pthread_attr_init( &attr );
0090 rtems_test_assert( !sc );
0091
0092 sc = pthread_attr_setstack( &attr, Stack_Low, PTHREAD_MINIMUM_STACK_SIZE );
0093 rtems_test_assert( !sc );
0094
0095
0096 sc = pthread_create( &id, &attr, Test_Thread, NULL );
0097 rtems_test_assert( !sc );
0098
0099 puts( "Init - let other thread run" );
0100 delay_request.tv_sec = 0;
0101 delay_request.tv_nsec = 5 * 100000000;
0102 sc = nanosleep( &delay_request, NULL );
0103 rtems_test_assert( !sc );
0104
0105 TEST_END();
0106
0107 rtems_test_exit(0);
0108 }
0109
0110
0111
0112 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0113 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0114
0115 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0116
0117 #define CONFIGURE_MAXIMUM_POSIX_THREADS 2
0118
0119 #define CONFIGURE_POSIX_INIT_THREAD_TABLE
0120
0121 #define CONFIGURE_INIT
0122 #include <rtems/confdefs.h>
0123