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 <pmacros.h>
0034 #include <errno.h>
0035 #include <pthread.h>
0036 #include <sched.h>
0037
0038 #include <rtems/posix/pthreadimpl.h>
0039 #include <rtems/score/stackimpl.h>
0040
0041 const char rtems_test_name[] = "PSXSTACK 1";
0042
0043
0044 void *POSIX_Init(void *argument);
0045 void *Test_Thread(void *argument);
0046
0047 void *Stack_Low;
0048 void *Stack_High;
0049
0050 void *Test_Thread(void *arg)
0051 {
0052 #if defined(__GNUC__)
0053 void *sp = __builtin_frame_address(0);
0054
0055 #if 0
0056 printf( "Stack(%p - %p) and sp=%p\n", Stack_Low, Stack_High, sp );
0057 #endif
0058
0059 if ( sp >= Stack_Low && sp <= Stack_High )
0060 puts( "Test_Thread - running on user provided stack - OK" );
0061 else {
0062 puts( "Test_Thread - ERROR running on other stack" );
0063 rtems_test_exit(0);
0064 }
0065 #else
0066 puts( "Test_Thread - no way to get stack pointer and verify" );
0067 #endif
0068 puts( "Test_Thread - delete self" );
0069 return NULL;
0070 }
0071
0072 void *POSIX_Init(
0073 void *argument
0074 )
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_setstackaddr( &attr, Stack_Low );
0093 rtems_test_assert( !sc );
0094
0095 sc = pthread_attr_setstacksize( &attr, PTHREAD_MINIMUM_STACK_SIZE );
0096 rtems_test_assert( !sc );
0097
0098
0099 sc = pthread_create( &id, &attr, Test_Thread, NULL );
0100 rtems_test_assert( !sc );
0101
0102 puts( "Init - let other thread run" );
0103 delay_request.tv_sec = 0;
0104 delay_request.tv_nsec = 5 * 100000000;
0105 sc = nanosleep( &delay_request, NULL );
0106 rtems_test_assert( !sc );
0107
0108 TEST_END();
0109 rtems_test_exit(0);
0110
0111 return NULL;
0112 }
0113
0114
0115
0116 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0117 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0118
0119 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0120
0121 #define CONFIGURE_MAXIMUM_POSIX_THREADS 2
0122
0123 #define CONFIGURE_POSIX_INIT_THREAD_TABLE
0124
0125 #define CONFIGURE_INIT
0126 #include <rtems/confdefs.h>