Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:43

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  * Copyright (C) 2020 embedded brains GmbH & Co. KG
0005  *
0006  * Redistribution and use in source and binary forms, with or without
0007  * modification, are permitted provided that the following conditions
0008  * are met:
0009  * 1. Redistributions of source code must retain the above copyright
0010  *    notice, this list of conditions and the following disclaimer.
0011  * 2. Redistributions in binary form must reproduce the above copyright
0012  *    notice, this list of conditions and the following disclaimer in the
0013  *    documentation and/or other materials provided with the distribution.
0014  *
0015  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0016  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0017  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0018  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0019  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0020  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0021  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0022  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0023  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0024  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0025  * POSSIBILITY OF SUCH DAMAGE.
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>