File indexing completed on 2025-05-11 08:24:43
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 #ifdef HAVE_CONFIG_H
0029 #include "config.h"
0030 #endif
0031
0032 #include <rtems/test.h>
0033 #include <rtems/test-info.h>
0034
0035 #include <rtems.h>
0036 #include <rtems/irq-extension.h>
0037 #include <rtems/malloc.h>
0038
0039 static void ensure_server_termination(void)
0040 {
0041 rtems_status_code sc;
0042 rtems_task_priority prio;
0043 rtems_id id;
0044 uint32_t cpu_self;
0045 uint32_t cpu_other;
0046
0047 prio = 0;
0048 sc = rtems_task_set_priority(RTEMS_SELF, 124, &prio);
0049 T_rsc_success(sc);
0050
0051 cpu_self = rtems_scheduler_get_processor();
0052 cpu_other = (cpu_self + 1) % 2;
0053
0054 sc = rtems_scheduler_ident_by_processor(cpu_other, &id);
0055 T_rsc_success(sc);
0056
0057 sc = rtems_task_set_scheduler(RTEMS_SELF, id, 124);
0058 T_rsc_success(sc);
0059
0060 sc = rtems_scheduler_ident_by_processor(cpu_self, &id);
0061 T_rsc_success(sc);
0062
0063 sc = rtems_task_set_scheduler(RTEMS_SELF, id, prio);
0064 T_rsc_success(sc);
0065 }
0066
0067 T_TEST_CASE(InterruptServerSMPInitializeIncorrectState)
0068 {
0069 rtems_status_code sc;
0070 uint32_t server_count;
0071
0072 T_assert_eq_u32(rtems_scheduler_get_processor_maximum(), 2);
0073
0074 sc = rtems_interrupt_server_delete(0);
0075 T_rsc(sc, RTEMS_INVALID_ID);
0076
0077 server_count = 456;
0078 sc = rtems_interrupt_server_initialize(
0079 123,
0080 RTEMS_MINIMUM_STACK_SIZE,
0081 RTEMS_DEFAULT_MODES,
0082 RTEMS_DEFAULT_ATTRIBUTES,
0083 &server_count
0084 );
0085 T_rsc_success(sc);
0086 T_eq_u32(server_count, 2);
0087
0088 server_count = 456;
0089 sc = rtems_interrupt_server_initialize(
0090 123,
0091 RTEMS_MINIMUM_STACK_SIZE,
0092 RTEMS_DEFAULT_MODES,
0093 RTEMS_DEFAULT_ATTRIBUTES,
0094 &server_count
0095 );
0096 T_rsc(sc, RTEMS_INCORRECT_STATE);
0097 T_eq_u32(server_count, 0);
0098
0099 sc = rtems_interrupt_server_delete(0);
0100 T_rsc_success(sc);
0101 ensure_server_termination();
0102
0103 sc = rtems_interrupt_server_delete(1);
0104 T_rsc_success(sc);
0105 ensure_server_termination();
0106 }
0107
0108 T_TEST_CASE(InterruptServerSMPInitializeInvalidPriority)
0109 {
0110 rtems_status_code sc;
0111 uint32_t server_count;
0112
0113 T_assert_eq_u32(rtems_scheduler_get_processor_maximum(), 2);
0114
0115 server_count = 456;
0116 sc = rtems_interrupt_server_initialize(
0117 0,
0118 RTEMS_MINIMUM_STACK_SIZE,
0119 RTEMS_DEFAULT_MODES,
0120 RTEMS_DEFAULT_ATTRIBUTES,
0121 &server_count
0122 );
0123 T_rsc(sc, RTEMS_INVALID_PRIORITY);
0124 T_eq_u32(server_count, 0);
0125
0126 server_count = 456;
0127 sc = rtems_interrupt_server_initialize(
0128 123,
0129 RTEMS_MINIMUM_STACK_SIZE,
0130 RTEMS_DEFAULT_MODES,
0131 RTEMS_DEFAULT_ATTRIBUTES,
0132 &server_count
0133 );
0134 T_rsc_success(sc);
0135 T_eq_u32(server_count, 2);
0136
0137 sc = rtems_interrupt_server_delete(0);
0138 T_rsc_success(sc);
0139 ensure_server_termination();
0140
0141 sc = rtems_interrupt_server_delete(1);
0142 T_rsc_success(sc);
0143 ensure_server_termination();
0144 }
0145
0146 T_TEST_CASE(InterruptServerSMPInitializeNoMemory)
0147 {
0148 rtems_status_code sc;
0149 uint32_t server_count;
0150 void *greedy;
0151
0152 T_assert_eq_u32(rtems_scheduler_get_processor_maximum(), 2);
0153
0154 greedy = rtems_heap_greedy_allocate(NULL, 0);
0155
0156 server_count = 456;
0157 sc = rtems_interrupt_server_initialize(
0158 123,
0159 RTEMS_MINIMUM_STACK_SIZE,
0160 RTEMS_DEFAULT_MODES,
0161 RTEMS_DEFAULT_ATTRIBUTES,
0162 &server_count
0163 );
0164 T_rsc(sc, RTEMS_NO_MEMORY);
0165 T_eq_u32(server_count, 1);
0166
0167 rtems_heap_greedy_free(greedy);
0168
0169 sc = rtems_interrupt_server_delete(0);
0170 T_rsc_success(sc);
0171 ensure_server_termination();
0172
0173 sc = rtems_interrupt_server_delete(1);
0174 T_rsc(sc, RTEMS_INVALID_ID);
0175 }
0176
0177 T_TEST_CASE(InterruptServerSMPInitializeNoScheduler)
0178 {
0179 rtems_status_code sc;
0180 uint32_t server_count;
0181 rtems_id scheduler_id;
0182 rtems_task_priority prio;
0183
0184 T_assert_eq_u32(rtems_scheduler_get_processor_maximum(), 2);
0185
0186 scheduler_id = 0;
0187 sc = rtems_scheduler_ident_by_processor(1, &scheduler_id);
0188 T_rsc_success(sc);
0189 T_ne_u32(scheduler_id, 0);
0190
0191 sc = rtems_scheduler_remove_processor(scheduler_id, 1);
0192 T_rsc_success(sc);
0193
0194 server_count = 456;
0195 sc = rtems_interrupt_server_initialize(
0196 123,
0197 RTEMS_MINIMUM_STACK_SIZE,
0198 RTEMS_DEFAULT_MODES,
0199 RTEMS_DEFAULT_ATTRIBUTES,
0200 &server_count
0201 );
0202 T_rsc_success(sc);
0203 T_eq_u32(server_count, 2);
0204
0205 sc = rtems_interrupt_server_delete(0);
0206 T_rsc_success(sc);
0207
0208 sc = rtems_interrupt_server_delete(1);
0209 T_rsc_success(sc);
0210
0211 prio = 0;
0212 sc = rtems_task_set_priority(RTEMS_SELF, 124, &prio);
0213 T_rsc_success(sc);
0214
0215 sc = rtems_task_set_priority(RTEMS_SELF, prio, &prio);
0216 T_rsc_success(sc);
0217
0218 sc = rtems_scheduler_add_processor(scheduler_id, 1);
0219 T_rsc_success(sc);
0220 }
0221
0222 const char rtems_test_name[] = "SMPIRQS 1";
0223
0224 static void Init(rtems_task_argument argument)
0225 {
0226 rtems_test_run(argument, TEST_STATE);
0227 }
0228
0229 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0230 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0231
0232 #define CONFIGURE_MAXIMUM_TASKS 3
0233
0234 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0235
0236 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0237
0238 #define CONFIGURE_MAXIMUM_PROCESSORS 2
0239
0240 #define CONFIGURE_SCHEDULER_EDF_SMP
0241
0242 #include <rtems/scheduler.h>
0243
0244 RTEMS_SCHEDULER_EDF_SMP(a);
0245
0246 RTEMS_SCHEDULER_EDF_SMP(b);
0247
0248 #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
0249 RTEMS_SCHEDULER_TABLE_EDF_SMP(a, rtems_build_name('A', ' ', ' ', ' ')), \
0250 RTEMS_SCHEDULER_TABLE_EDF_SMP(b, rtems_build_name('B', ' ', ' ', ' '))
0251
0252 #define CONFIGURE_SCHEDULER_ASSIGNMENTS \
0253 RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
0254 RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL)
0255
0256 #define CONFIGURE_INIT
0257
0258 #include <rtems/confdefs.h>