source: rtems/cpukit/sapi/include/confdefs.h @ 69aa3349

4.11
Last change on this file since 69aa3349 was 69aa3349, checked in by Sebastian Huber <sebastian.huber@…>, on Apr 8, 2014 at 7:42:29 AM

score: Simplify thread control initialization

The thread control block contains fields that point to application
configuration dependent memory areas, like the scheduler information,
the API control blocks, the user extension context table, the RTEMS
notepads and the Newlib re-entrancy support. Account for these areas in
the configuration and avoid extra workspace allocations for these areas.

This helps also to avoid heap fragementation and reduces the per thread
memory due to a reduced heap allocation overhead.

  • Property mode set to 100644
File size: 90.5 KB
Line 
1/**
2 * @file
3 *
4 * @brief Configuration Table Template that will be Instantiated
5 * by an Application
6 *
7 * This include file contains the configuration table template that will
8 * be instantiated by an application based on the setting of a number
9 * of macros.  The macros are documented in the Configuring a System
10 * chapter of the Classic API User's Guide
11 *
12 * The model is to estimate the memory required for each configured item
13 * and sum those estimates.  The estimate can be too high or too low for
14 * a variety of reasons:
15 *
16 * Reasons estimate is too high:
17 *   + FP contexts (not all tasks are FP)
18 *
19 * Reasons estimate is too low:
20 *   + stacks greater than minimum size
21 *   + messages
22 *   + application must account for device driver resources
23 *   + application must account for add-on library resource requirements
24 *
25 * NOTE:  Eventually this may be able to take into account some of
26 *        the above.  This procedure has evolved from just enough to
27 *        support the RTEMS Test Suites into something that can be
28 *        used remarkably reliably by most applications.
29 */
30
31/*
32 *  COPYRIGHT (c) 1989-2014.
33 *  On-Line Applications Research Corporation (OAR).
34 *
35 *  The license and distribution terms for this file may be
36 *  found in the file LICENSE in this distribution or at
37 *  http://www.rtems.org/license/LICENSE.
38 */
39
40#ifndef __CONFIGURATION_TEMPLATE_h
41#define __CONFIGURATION_TEMPLATE_h
42
43/*
44 * Include the executive's configuration
45 */
46#include <rtems.h>
47#include <rtems/score/apimutex.h>
48#include <rtems/score/wkspace.h>
49
50#ifdef CONFIGURE_DISABLE_BSP_SETTINGS
51  #undef BSP_DEFAULT_UNIFIED_WORK_AREAS
52  #undef BSP_IDLE_TASK_BODY
53  #undef BSP_IDLE_TASK_STACK_SIZE
54  #undef BSP_INITIAL_EXTENSION
55  #undef BSP_INTERRUPT_STACK_SIZE
56  #undef BSP_MAXIMUM_DEVICES
57  #undef BSP_ZERO_WORKSPACE_AUTOMATICALLY
58  #undef CONFIGURE_BSP_PREREQUISITE_DRIVERS
59  #undef CONFIGURE_MALLOC_BSP_SUPPORTS_SBRK
60#else
61  #include <bsp.h>
62#endif
63
64#ifdef RTEMS_NEWLIB
65  #include <sys/reent.h>
66#endif
67
68#ifdef __cplusplus
69extern "C" {
70#endif
71
72extern rtems_initialization_tasks_table Initialization_tasks[];
73#if defined(RTEMS_MULTIPROCESSING)
74  extern rtems_multiprocessing_table      Multiprocessing_configuration;
75#endif
76#ifdef RTEMS_POSIX_API
77  extern posix_api_configuration_table    Configuration_POSIX_API;
78#endif
79
80/**
81 * This macro determines whether the RTEMS reentrancy support for
82 * the Newlib C Library is enabled.
83 */
84#ifdef RTEMS_SCHEDSIM
85  #undef RTEMS_NEWLIB
86#endif
87
88#if (defined(RTEMS_NEWLIB) && !defined(CONFIGURE_DISABLE_NEWLIB_REENTRANCY))
89  #define CONFIGURE_NEWLIB_EXTENSION 1
90#else
91  #define CONFIGURE_NEWLIB_EXTENSION 0
92#endif
93
94#ifndef RTEMS_SCHEDSIM
95#include <rtems/libio.h>
96
97#ifdef CONFIGURE_INIT
98const rtems_libio_helper rtems_libio_init_helper =
99  #ifdef CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
100    rtems_libio_helper_null;
101  #else
102    rtems_libio_init;
103  #endif
104
105const rtems_libio_helper rtems_libio_post_driver_helper =
106  #ifdef CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
107    rtems_libio_helper_null;
108  #else
109    rtems_libio_post_driver;
110  #endif
111
112const rtems_libio_helper rtems_libio_exit_helper =
113  #ifdef CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
114    rtems_libio_helper_null;
115  #else
116    rtems_libio_exit;
117  #endif
118
119const rtems_libio_helper rtems_fs_init_helper =
120  #ifdef CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
121    rtems_libio_helper_null;
122  #else
123    rtems_filesystem_initialize;
124  #endif
125#endif
126#endif
127
128/*
129 *  If the application disables the filesystem, they will not need
130 *  a mount table, so do not produce one.
131 */
132#ifdef CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
133  #define CONFIGURE_HAS_OWN_MOUNT_TABLE
134#endif
135
136/**
137 * This macro defines the number of POSIX file descriptors allocated
138 * and managed by libio.  These are the "integer" file descriptors that
139 * are used by calls like open(2) and read(2).
140 */
141#ifndef CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS
142  #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 3
143#endif
144
145/**
146 * Semaphore count used by the IO library.
147 */
148#define CONFIGURE_LIBIO_SEMAPHORES 1
149
150/**
151 * POSIX key count used by the IO library.
152 */
153#define CONFIGURE_LIBIO_POSIX_KEYS 1
154
155#ifdef CONFIGURE_INIT
156  /**
157   * When instantiating the configuration tables, this variable is
158   * initialized to specify the maximum number of file descriptors.
159   */
160  uint32_t rtems_libio_number_iops = CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS;
161#endif
162
163/**
164 * This macro determines if termios is disabled by this application.
165 * This only means that resources will not be reserved.  If you end
166 * up using termios, it will fail.
167 */
168#ifdef CONFIGURE_TERMIOS_DISABLED
169  #define CONFIGURE_TERMIOS_SEMAPHORES 0
170#else
171  /**
172   * This macro specifies the number of serial or PTY ports that will
173   * use termios.
174   */
175  #ifndef CONFIGURE_NUMBER_OF_TERMIOS_PORTS
176  #define CONFIGURE_NUMBER_OF_TERMIOS_PORTS 1
177  #endif
178
179  /**
180   * This macro reserves the number of semaphores required by termios
181   * based upon the number of communication ports that will use it.
182   */
183  #define CONFIGURE_TERMIOS_SEMAPHORES \
184    ((CONFIGURE_NUMBER_OF_TERMIOS_PORTS * 4) + 1)
185#endif
186
187/**
188 * This macro specifies the number of PTYs that can be concurrently
189 * active.
190 */
191#ifndef CONFIGURE_MAXIMUM_PTYS
192  #define CONFIGURE_MAXIMUM_PTYS 0
193#endif
194
195/**
196 * This variable contains the maximum number of PTYs that can be
197 * concurrently active.
198 */
199#ifdef CONFIGURE_INIT
200  int rtems_telnetd_maximum_ptys = CONFIGURE_MAXIMUM_PTYS;
201#else
202  extern int rtems_telnetd_maximum_ptys;
203#endif
204
205#if defined(RTEMS_SMP)
206  /*
207   *  If configured for SMP, then we need to know the maximum CPU cores.
208   */
209  #if !defined(CONFIGURE_SMP_APPLICATION)
210    #if !defined(CONFIGURE_SMP_MAXIMUM_PROCESSORS)
211      #define CONFIGURE_SMP_MAXIMUM_PROCESSORS 1
212    #endif
213  #else
214    #if !defined(CONFIGURE_SMP_MAXIMUM_PROCESSORS)
215      #error "CONFIGURE_SMP_MAXIMUM_PROCESSORS not specified for SMP Application"
216    #endif
217  #endif
218#endif
219
220/*
221 *  Filesystems and Mount Table Configuration.
222 *
223 *  Defines to control the file system:
224 *
225 *   CONFIGURE_APPLICATION_DISABLE_FILESYSTEM:
226 *     Disable the RTEMS filesystems. You get an empty DEVFS.
227 *
228 *   CONFIGURE_USE_DEVFS_AS_BASE_FILESYSTEM:
229 *     Use the DEVFS as the root file system. Limited functions are
230 *     provided when this is used.
231 *
232 *   CONFIGURE_FILESYSTEM_ALL:
233 *     Add file filesystems to the default filesystem table.
234 *
235 *   List of available file systems. You can define as many as you like:
236 *     CONFIGURE_FILESYSTEM_MINIIMFS - MiniIMFS, use DEVFS now
237 *     CONFIGURE_FILESYSTEM_IMFS     - In Memory File System (IMFS)
238 *     CONFIGURE_FILESYSTEM_DEVFS    - Device File System (DSVFS)
239 *     CONFIGURE_FILESYSTEM_TFTPFS   - TFTP File System, networking enabled
240 *     CONFIGURE_FILESYSTEM_FTPFS    - FTP File System, networking enabled
241 *     CONFIGURE_FILESYSTEM_NFS      - Network File System, networking enabled
242 *     CONFIGURE_FILESYSTEM_DOSFS    - DOS File System, uses libblock
243 *     CONFIGURE_FILESYSTEM_RFS      - RTEMS File System (RFS), uses libblock
244 *     CONFIGURE_FILESYSTEM_JFFS2    - Journalling Flash File System, Version 2
245 *
246 *   Combinations:
247 *
248 *    - If nothing is defined the base file system is the IMFS.
249 *
250 *    - If CONFIGURE_APPLICATION_DISABLE_FILESYSTEM is defined all filesystem
251 *      are disabled by force and an empty DEVFS is created.
252 *
253 *    - If CONFIGURE_USE_DEV_AS_BASE_FILESYSTEM is defined all filesystem
254 *      are disabled by force and DEVFS is defined.
255 */
256
257#ifdef CONFIGURE_INIT
258
259  /*
260   * Include all file systems. Do this before checking if the filesystem has
261   * been disabled.
262   */
263  #ifdef CONFIGURE_FILESYSTEM_ALL
264    #define CONFIGURE_FILESYSTEM_MINIIMFS
265    #define CONFIGURE_FILESYSTEM_IMFS
266    #define CONFIGURE_FILESYSTEM_DEVFS
267    #define CONFIGURE_FILESYSTEM_TFTPFS
268    #define CONFIGURE_FILESYSTEM_FTPFS
269    #define CONFIGURE_FILESYSTEM_NFS
270    #define CONFIGURE_FILESYSTEM_DOSFS
271    #define CONFIGURE_FILESYSTEM_RFS
272    #define CONFIGURE_FILESYSTEM_JFFS2
273  #endif
274
275  /*
276   * If disabling the file system, give a compile error if the user has
277   * configured other filesystem parameters.
278   */
279  #if defined(CONFIGURE_APPLICATION_DISABLE_FILESYSTEM)
280     #if defined(CONFIGURE_USE_DEVFS_AS_BASE_FILESYSTEM) || \
281         defined(CONFIGURE_USE_MINIIMFS_AS_BASE_FILESYSTEM)
282       #error "Filesystem disabled but a base filesystem configured."
283     #endif
284
285    #if defined(CONFIGURE_FILESYSTEM_MINIIMFS) || \
286        defined(CONFIGURE_FILESYSTEM_IMFS) || \
287        defined(CONFIGURE_FILESYSTEM_DEVFS) || \
288        defined(CONFIGURE_FILESYSTEM_TFTPFS) || \
289        defined(CONFIGURE_FILESYSTEM_FTPFS) || \
290        defined(CONFIGURE_FILESYSTEM_NFS) || \
291        defined(CONFIGURE_FILESYSTEM_DOSFS) || \
292        defined(CONFIGURE_FILESYSTEM_RFS) || \
293        defined(CONFIGURE_FILESYSTEM_JFFS2)
294        #error "Configured filesystems but root filesystem was not IMFS!"
295        #error "Filesystems could be disabled, DEVFS is root, or"
296        #error "  miniIMFS is root!"
297     #endif
298  #endif
299
300  /*
301   * If the base filesystem is DEVFS define it else define IMFS.
302   * We will have either DEVFS or IMFS defined after this.
303   */
304  #if !defined(CONFIGURE_APPLICATION_DISABLE_FILESYSTEM)
305    #if defined(CONFIGURE_USE_DEVFS_AS_BASE_FILESYSTEM)
306      #define CONFIGURE_FILESYSTEM_DEVFS
307    #elif defined(CONFIGURE_USE_MINIIMFS_AS_BASE_FILESYSTEM)
308      #define CONFIGURE_FILESYSTEM_MINIIMFS
309    #elif !defined(CONFIGURE_FILESYSTEM_IMFS)
310      #define CONFIGURE_FILESYSTEM_IMFS
311    #endif
312  #endif
313
314#endif
315
316#ifndef RTEMS_SCHEDSIM
317/**
318 * IMFS
319 */
320#include <rtems/imfs.h>
321
322/**
323 * This specifies the number of bytes per block for files within the IMFS.
324 * There are a maximum number of blocks per file so this dictates the maximum
325 * size of a file.  This has to be balanced with the unused portion of each
326 * block that might be wasted.
327 */
328#ifndef CONFIGURE_IMFS_MEMFILE_BYTES_PER_BLOCK
329  #define CONFIGURE_IMFS_MEMFILE_BYTES_PER_BLOCK \
330                    IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK
331#endif
332
333/**
334 * This defines the miniIMFS file system table entry.
335 */
336#if !defined(CONFIGURE_FILESYSTEM_ENTRY_miniIMFS) && \
337    defined(CONFIGURE_FILESYSTEM_MINIIMFS)
338  #define CONFIGURE_FILESYSTEM_ENTRY_miniIMFS \
339    { RTEMS_FILESYSTEM_TYPE_MINIIMFS, miniIMFS_initialize }
340#endif
341#endif
342
343/**
344 * Internall it is called FIFOs not pipes
345 */
346#if defined(CONFIGURE_PIPES_ENABLED)
347  #define CONFIGURE_FIFOS_ENABLED
348#endif
349
350#ifndef RTEMS_SCHEDSIM
351/**
352 * This defines the IMFS file system table entry.
353 */
354#if !defined(CONFIGURE_FILESYSTEM_ENTRY_IMFS) && \
355    defined(CONFIGURE_FILESYSTEM_IMFS)
356  #if defined(CONFIGURE_FIFOS_ENABLED)
357    #define CONFIGURE_FILESYSTEM_ENTRY_IMFS \
358      { RTEMS_FILESYSTEM_TYPE_IMFS, fifoIMFS_initialize }
359  #else
360    #define CONFIGURE_FILESYSTEM_ENTRY_IMFS \
361      { RTEMS_FILESYSTEM_TYPE_IMFS, IMFS_initialize }
362  #endif
363#endif
364#endif
365
366/**
367 * This sets up the resources for the PIPES/FIFOs
368 */
369#if defined(CONFIGURE_FIFOS_ENABLED)
370  #if !defined(CONFIGURE_MAXIMUM_FIFOS) && !defined(CONFIGURE_MAXIMUM_PIPES)
371     #error "No FIFOs or PIPES configured"
372  #endif
373  #if !defined(CONFIGURE_MAXIMUM_FIFOS)
374    #define CONFIGURE_MAXIMUM_FIFOS 0
375  #endif
376  #if !defined(CONFIGURE_MAXIMUM_PIPES)
377    #define CONFIGURE_MAXIMUM_PIPES 0
378  #endif
379  #define CONFIGURE_BARRIERS_FOR_FIFOS \
380    (2 * (CONFIGURE_MAXIMUM_FIFOS + CONFIGURE_MAXIMUM_PIPES))
381  #define CONFIGURE_SEMAPHORES_FOR_FIFOS \
382    (1 + (CONFIGURE_MAXIMUM_FIFOS + CONFIGURE_MAXIMUM_PIPES))
383#else
384  #define CONFIGURE_BARRIERS_FOR_FIFOS   0
385  #define CONFIGURE_SEMAPHORES_FOR_FIFOS 0
386#endif
387
388/**
389 * DEVFS
390 */
391#if !defined(CONFIGURE_FILESYSTEM_ENTRY_DEVFS) && \
392    defined(CONFIGURE_FILESYSTEM_DEVFS)
393#include <rtems/devfs.h>
394  #define CONFIGURE_FILESYSTEM_ENTRY_DEVFS \
395    { RTEMS_FILESYSTEM_TYPE_DEVFS, devFS_initialize }
396#endif
397
398#ifdef RTEMS_NETWORKING
399  /**
400   * FTPFS
401   */
402  #if !defined(CONFIGURE_FILESYSTEM_ENTRY_FTPFS) && \
403      defined(CONFIGURE_FILESYSTEM_FTPFS)
404    #include <rtems/ftpfs.h>
405    #define CONFIGURE_FILESYSTEM_ENTRY_FTPFS \
406      { RTEMS_FILESYSTEM_TYPE_FTPFS, rtems_ftpfs_initialize }
407  #endif
408
409  /**
410   * TFTPFS
411   */
412  #if !defined(CONFIGURE_FILESYSTEM_ENTRY_TFTPFS) && \
413      defined(CONFIGURE_FILESYSTEM_TFTPFS)
414    #include <rtems/tftp.h>
415    #define CONFIGURE_FILESYSTEM_ENTRY_TFTPFS \
416      { RTEMS_FILESYSTEM_TYPE_TFTPFS, rtems_tftpfs_initialize }
417  #endif
418
419  /**
420   * NFS
421   */
422  #if !defined(CONFIGURE_FILESYSTEM_ENTRY_NFS) && \
423      defined(CONFIGURE_FILESYSTEM_NFS)
424    #include <librtemsNfs.h>
425    #define CONFIGURE_FILESYSTEM_ENTRY_NFS \
426      { RTEMS_FILESYSTEM_TYPE_NFS, rtems_nfs_initialize }
427  #endif
428#endif
429
430/**
431 * DOSFS
432 */
433#if !defined(CONFIGURE_FILESYSTEM_ENTRY_DOSFS) && \
434    defined(CONFIGURE_FILESYSTEM_DOSFS)
435  #include <rtems/dosfs.h>
436  #define CONFIGURE_FILESYSTEM_ENTRY_DOSFS \
437    { RTEMS_FILESYSTEM_TYPE_DOSFS, rtems_dosfs_initialize }
438#endif
439
440/**
441 * RFS
442 */
443#if !defined(CONFIGURE_FILESYSTEM_ENTRY_RFS) && \
444    defined(CONFIGURE_FILESYSTEM_RFS)
445  #include <rtems/rtems-rfs.h>
446  #define CONFIGURE_FILESYSTEM_ENTRY_RFS \
447    { RTEMS_FILESYSTEM_TYPE_RFS, rtems_rfs_rtems_initialise }
448#endif
449
450/**
451 * JFFS2
452 */
453#if !defined(CONFIGURE_FILESYSTEM_ENTRY_JFFS2) && \
454    defined(CONFIGURE_FILESYSTEM_JFFS2)
455  #include <rtems/jffs2.h>
456  #define CONFIGURE_FILESYSTEM_ENTRY_JFFS2 \
457    { RTEMS_FILESYSTEM_TYPE_JFFS2, rtems_jffs2_initialize }
458#endif
459
460#ifdef CONFIGURE_INIT
461
462  /**
463   * DEVFS variables.
464   *
465   * The number of individual devices that may be registered
466   * in the system or the CONFIGURE_MAXIMUM_DEVICES variable
467   * is defaulted to 4 when a filesystem is enabled, unless
468   * the bsp overwrides this.  In which case the value is set
469   * to BSP_MAXIMUM_DEVICES.
470   */
471  #ifdef CONFIGURE_FILESYSTEM_DEVFS
472    #ifndef CONFIGURE_MAXIMUM_DEVICES
473      #if defined(BSP_MAXIMUM_DEVICES)
474        #define CONFIGURE_MAXIMUM_DEVICES BSP_MAXIMUM_DEVICES
475      #else
476        #define CONFIGURE_MAXIMUM_DEVICES 4
477      #endif
478    #endif
479    #include <rtems/devfs.h>
480  #endif
481
482#ifndef RTEMS_SCHEDSIM
483  #if defined(CONFIGURE_FILESYSTEM_IMFS) || \
484      defined(CONFIGURE_FILESYSTEM_MINIIMFS)
485    int imfs_rq_memfile_bytes_per_block = CONFIGURE_IMFS_MEMFILE_BYTES_PER_BLOCK;
486  #endif
487#endif
488
489  /**
490   * Table termination record.
491   */
492  #define CONFIGURE_FILESYSTEM_NULL { NULL, NULL }
493
494#ifndef RTEMS_SCHEDSIM
495  /**
496   * The default file system table. Must be terminated with the NULL entry if
497   * you provide your own.
498   */
499  #ifndef CONFIGURE_HAS_OWN_FILESYSTEM_TABLE
500    const rtems_filesystem_table_t rtems_filesystem_table[] = {
501      #if defined(CONFIGURE_FILESYSTEM_MINIIMFS) && \
502          defined(CONFIGURE_FILESYSTEM_ENTRY_miniIMFS)
503        CONFIGURE_FILESYSTEM_ENTRY_miniIMFS,
504      #endif
505      #if defined(CONFIGURE_FILESYSTEM_IMFS) && \
506          defined(CONFIGURE_FILESYSTEM_ENTRY_IMFS)
507        CONFIGURE_FILESYSTEM_ENTRY_IMFS,
508      #endif
509      #if defined(CONFIGURE_FILESYSTEM_DEVFS) && \
510          defined(CONFIGURE_FILESYSTEM_ENTRY_DEVFS)
511        CONFIGURE_FILESYSTEM_ENTRY_DEVFS,
512      #endif
513      #if defined(CONFIGURE_FILESYSTEM_TFTPFS) && \
514          defined(CONFIGURE_FILESYSTEM_ENTRY_TFTPFS)
515        CONFIGURE_FILESYSTEM_ENTRY_TFTPFS,
516      #endif
517      #if defined(CONFIGURE_FILESYSTEM_FTPFS) && \
518          defined(CONFIGURE_FILESYSTEM_ENTRY_FTPFS)
519        CONFIGURE_FILESYSTEM_ENTRY_FTPFS,
520      #endif
521      #if defined(CONFIGURE_FILESYSTEM_NFS) && \
522          defined(CONFIGURE_FILESYSTEM_ENTRY_NFS)
523        CONFIGURE_FILESYSTEM_ENTRY_NFS,
524      #endif
525      #if defined(CONFIGURE_FILESYSTEM_DOSFS) && \
526          defined(CONFIGURE_FILESYSTEM_ENTRY_DOSFS)
527        CONFIGURE_FILESYSTEM_ENTRY_DOSFS,
528      #endif
529      #if defined(CONFIGURE_FILESYSTEM_RFS) && \
530          defined(CONFIGURE_FILESYSTEM_ENTRY_RFS)
531        CONFIGURE_FILESYSTEM_ENTRY_RFS,
532      #endif
533      #if defined(CONFIGURE_FILESYSTEM_JFFS2) && \
534          defined(CONFIGURE_FILESYSTEM_ENTRY_JFFS2)
535        CONFIGURE_FILESYSTEM_ENTRY_JFFS2,
536      #endif
537      CONFIGURE_FILESYSTEM_NULL
538    };
539  #endif
540
541  #ifndef CONFIGURE_HAS_OWN_MOUNT_TABLE
542    #if defined(CONFIGURE_USE_DEVFS_AS_BASE_FILESYSTEM)
543      static devFS_node devFS_root_filesystem_nodes [CONFIGURE_MAXIMUM_DEVICES];
544      static const devFS_data devFS_root_filesystem_data = {
545        devFS_root_filesystem_nodes,
546        CONFIGURE_MAXIMUM_DEVICES
547      };
548    #endif
549    const rtems_filesystem_mount_configuration
550      rtems_filesystem_root_configuration = {
551      NULL,
552      NULL,
553      #if defined(CONFIGURE_USE_DEVFS_AS_BASE_FILESYSTEM)
554        RTEMS_FILESYSTEM_TYPE_DEVFS,
555      #elif defined(CONFIGURE_USE_MINIIMFS_AS_BASE_FILESYSTEM)
556        RTEMS_FILESYSTEM_TYPE_MINIIMFS,
557      #else
558        RTEMS_FILESYSTEM_TYPE_IMFS,
559      #endif
560      RTEMS_FILESYSTEM_READ_WRITE,
561      #if defined(CONFIGURE_USE_DEVFS_AS_BASE_FILESYSTEM)
562        &devFS_root_filesystem_data
563      #else
564        NULL
565      #endif
566    };
567  #endif
568
569#endif
570#endif
571
572/*
573 *  STACK_CHECKER_ON was still available in 4.9 so give a warning for now.
574 */
575#if defined(STACK_CHECKER_ON)
576  #define CONFIGURE_STACK_CHECKER_ENABLED
577  #warning "STACK_CHECKER_ON deprecated -- use CONFIGURE_STACK_CHECKER_ENABLED"
578#endif
579
580/**
581 * This configures the stack checker user extension.
582 */
583#ifdef CONFIGURE_STACK_CHECKER_ENABLED
584  #define CONFIGURE_STACK_CHECKER_EXTENSION 1
585#else
586  #define CONFIGURE_STACK_CHECKER_EXTENSION 0
587#endif
588
589/**
590 * @brief Maximum priority configuration.
591 *
592 * This configures the maximum priority value that
593 * a task may have.
594 *
595 * The following applies to the data space requirements
596 * of the Priority Scheduler.
597 *
598 * By reducing the number of priorities in a system,
599 * the amount of RAM required by RTEMS can be significantly
600 * reduced.  RTEMS allocates a Chain_Control structure per
601 * priority and this structure contains 3 pointers.  So
602 * the default is (256 * 12) = 3K on 32-bit architectures.
603 *
604 * This must be one less than a power of 2 between
605 * 4 and 256.  Valid values along with the application
606 * priority levels and memory saved when pointers are
607 * 32-bits in size are:
608 *
609 *   + 3,  2 application priorities, 3024 bytes saved
610 *   + 7, 5 application priorities, 2976 bytes saved
611 *   + 15, 13 application priorities, 2880 bytes saved
612 *   + 31, 29 application priorities, 2688 bytes saved
613 *   + 63, 61 application priorities, 2304 bytes saved
614 *   + 127, 125 application priorities, 1536 bytes saved
615 *   + 255, 253 application priorities, 0 bytes saved
616 *
617 * It is specified in terms of Classic API priority values.
618 */
619#ifndef CONFIGURE_MAXIMUM_PRIORITY
620  #define CONFIGURE_MAXIMUM_PRIORITY PRIORITY_DEFAULT_MAXIMUM
621#endif
622
623/*
624 * Scheduler configuration.
625 *
626 * The scheduler configuration allows an application to select the
627 * scheduling policy to use.  The supported configurations are:
628 *  CONFIGURE_SCHEDULER_USER       - user provided scheduler
629 *  CONFIGURE_SCHEDULER_PRIORITY   - Deterministic Priority Scheduler
630 *  CONFIGURE_SCHEDULER_PRIORITY_SMP - Deterministic Priority SMP Scheduler
631 *  CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP - Deterministic Priority SMP Affinity Scheduler
632 *  CONFIGURE_SCHEDULER_SIMPLE     - Light-weight Priority Scheduler
633 *  CONFIGURE_SCHEDULER_SIMPLE_SMP - Simple SMP Priority Scheduler
634 *  CONFIGURE_SCHEDULER_EDF        - EDF Scheduler
635 *  CONFIGURE_SCHEDULER_CBS        - CBS Scheduler
636 *
637 * If no configuration is specified by the application, then
638 * CONFIGURE_SCHEDULER_PRIORITY is assumed to be the default.
639 *
640 * An application can define its own scheduling policy by defining
641 * CONFIGURE_SCHEDULER_USER and the following:
642 *    - CONFIGURE_SCHEDULER_CONTEXT
643 *    - CONFIGURE_SCHEDULER_CONTROLS
644 *    - CONFIGURE_SCHEDULER_USER_PER_THREAD
645 */
646
647/* If no scheduler is specified, the priority scheduler is default. */
648#if !defined(CONFIGURE_SCHEDULER_USER) && \
649    !defined(CONFIGURE_SCHEDULER_PRIORITY) && \
650    !defined(CONFIGURE_SCHEDULER_PRIORITY_SMP) && \
651    !defined(CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP) && \
652    !defined(CONFIGURE_SCHEDULER_SIMPLE) && \
653    !defined(CONFIGURE_SCHEDULER_SIMPLE_SMP) && \
654    !defined(CONFIGURE_SCHEDULER_EDF) && \
655    !defined(CONFIGURE_SCHEDULER_CBS)
656  #if defined(RTEMS_SMP) && defined(CONFIGURE_SMP_APPLICATION)
657    #define CONFIGURE_SCHEDULER_PRIORITY_SMP
658  #else
659    #define CONFIGURE_SCHEDULER_PRIORITY
660  #endif
661#endif
662
663#include <rtems/scheduler.h>
664
665/*
666 * If the Priority Scheduler is selected, then configure for it.
667 */
668#if defined(CONFIGURE_SCHEDULER_PRIORITY)
669  #if !defined(CONFIGURE_SCHEDULER_CONTROLS)
670    #define CONFIGURE_SCHEDULER_CONTEXT \
671      RTEMS_SCHEDULER_CONTEXT_PRIORITY( \
672        dflt, \
673        CONFIGURE_MAXIMUM_PRIORITY + 1 \
674      )
675
676    #define CONFIGURE_SCHEDULER_CONTROLS \
677      RTEMS_SCHEDULER_CONTROL_PRIORITY(dflt)
678  #endif
679#endif
680
681/*
682 * If the Deterministic Priority SMP Scheduler is selected, then configure for
683 * it.
684 */
685#if defined(CONFIGURE_SCHEDULER_PRIORITY_SMP)
686  #if !defined(CONFIGURE_SCHEDULER_CONTROLS)
687    #define CONFIGURE_SCHEDULER_CONTEXT \
688      RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP( \
689        dflt, \
690        CONFIGURE_MAXIMUM_PRIORITY + 1 \
691      )
692
693    #define CONFIGURE_SCHEDULER_CONTROLS \
694      RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(dflt)
695  #endif
696#endif
697
698/*
699 * If the Deterministic Priority Affinity SMP Scheduler is selected, then configure for
700 * it.
701 */
702#if defined(CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP)
703  #if !defined(CONFIGURE_SCHEDULER_CONTROLS)
704    #define CONFIGURE_SCHEDULER_CONTEXT \
705      RTEMS_SCHEDULER_CONTEXT_PRIORITY_AFFINITY_SMP( \
706        dflt, \
707        CONFIGURE_MAXIMUM_PRIORITY + 1 \
708      )
709
710    #define CONFIGURE_SCHEDULER_CONTROLS \
711      RTEMS_SCHEDULER_CONTROL_PRIORITY_AFFINITY_SMP(dflt)
712  #endif
713#endif
714
715/*
716 * If the Simple Priority Scheduler is selected, then configure for it.
717 */
718#if defined(CONFIGURE_SCHEDULER_SIMPLE)
719  #if !defined(CONFIGURE_SCHEDULER_CONTROLS)
720    #define CONFIGURE_SCHEDULER_CONTEXT RTEMS_SCHEDULER_CONTEXT_SIMPLE(dflt)
721
722    #define CONFIGURE_SCHEDULER_CONTROLS RTEMS_SCHEDULER_CONTROL_SIMPLE(dflt)
723  #endif
724#endif
725
726/*
727 * If the Simple SMP Priority Scheduler is selected, then configure for it.
728 */
729#if defined(CONFIGURE_SCHEDULER_SIMPLE_SMP)
730  #if !defined(CONFIGURE_SCHEDULER_CONTROLS)
731    #define CONFIGURE_SCHEDULER_CONTEXT \
732      RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP(dflt)
733
734    #define CONFIGURE_SCHEDULER_CONTROLS \
735      RTEMS_SCHEDULER_CONTROL_SIMPLE_SMP(dflt)
736  #endif
737#endif
738
739/*
740 * If the EDF Scheduler is selected, then configure for it.
741 */
742#if defined(CONFIGURE_SCHEDULER_EDF)
743  #if !defined(CONFIGURE_SCHEDULER_CONTROLS)
744    #define CONFIGURE_SCHEDULER_CONTEXT RTEMS_SCHEDULER_CONTEXT_EDF(dflt)
745
746    #define CONFIGURE_SCHEDULER_CONTROLS RTEMS_SCHEDULER_CONTROL_EDF(dflt)
747  #endif
748#endif
749
750/*
751 * If the CBS Scheduler is selected, then configure for it.
752 */
753#if defined(CONFIGURE_SCHEDULER_CBS)
754  #if !defined(CONFIGURE_SCHEDULER_CONTROLS)
755    #define CONFIGURE_SCHEDULER_CONTEXT RTEMS_SCHEDULER_CONTEXT_CBS(dflt)
756
757    #define CONFIGURE_SCHEDULER_CONTROLS RTEMS_SCHEDULER_CONTROL_CBS(dflt)
758  #endif
759
760  #ifndef CONFIGURE_CBS_MAXIMUM_SERVERS
761    #define CONFIGURE_CBS_MAXIMUM_SERVERS CONFIGURE_MAXIMUM_TASKS
762  #endif
763
764  #ifdef CONFIGURE_INIT
765    const uint32_t _Scheduler_CBS_Maximum_servers =
766      CONFIGURE_CBS_MAXIMUM_SERVERS;
767
768    Scheduler_CBS_Server
769      _Scheduler_CBS_Server_list[ CONFIGURE_CBS_MAXIMUM_SERVERS ];
770  #endif
771#endif
772
773/*
774 * Set up the scheduler entry points table.  The scheduling code uses
775 * this code to know which scheduler is configured by the user.
776 */
777#ifdef CONFIGURE_INIT
778  CONFIGURE_SCHEDULER_CONTEXT;
779
780  const Scheduler_Control _Scheduler_Table[] = {
781    CONFIGURE_SCHEDULER_CONTROLS
782  };
783
784  #if defined(RTEMS_SMP)
785    const size_t _Scheduler_Count =
786      RTEMS_ARRAY_SIZE( _Scheduler_Table );
787  #endif
788
789  #if defined(CONFIGURE_SCHEDULER_EDF)
790    const bool _Scheduler_FIXME_thread_priority_queues_are_broken = true;
791  #else
792    const bool _Scheduler_FIXME_thread_priority_queues_are_broken = false;
793  #endif
794#endif
795
796/*
797 *  If you said the IDLE task was going to do application initialization
798 *  and didn't override the IDLE body, then something is amiss.
799 */
800#if (defined(CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION) && \
801     !defined(CONFIGURE_IDLE_TASK_BODY))
802  #error "CONFIGURE_ERROR: You did not override the IDLE task body."
803#endif
804
805/**
806 * @brief Idle task body configuration.
807 *
808 * There is a default IDLE thread body provided by RTEMS which
809 * has the possibility of being CPU specific.  There may be a
810 * BSP specific override of the RTEMS default body and in turn,
811 * the application may override and provide its own.
812 */
813#ifndef CONFIGURE_IDLE_TASK_BODY
814  #if defined(BSP_IDLE_TASK_BODY)
815    #define CONFIGURE_IDLE_TASK_BODY BSP_IDLE_TASK_BODY
816  #elif (CPU_PROVIDES_IDLE_THREAD_BODY == TRUE)
817    #define CONFIGURE_IDLE_TASK_BODY _CPU_Thread_Idle_body
818  #else
819    /* only instantiate and compile if used */
820    #ifdef CONFIGURE_INIT
821      void *_Thread_Idle_body(uintptr_t ignored)
822      {
823        for( ; ; ) ;
824        return 0;   /* to avoid warning */
825      }
826    #endif
827    #define CONFIGURE_IDLE_TASK_BODY _Thread_Idle_body
828  #endif
829#endif
830
831/**
832 * By default, use the minimum stack size requested by this port.
833 */
834#ifndef CONFIGURE_MINIMUM_TASK_STACK_SIZE
835  #define CONFIGURE_MINIMUM_TASK_STACK_SIZE CPU_STACK_MINIMUM_SIZE
836#endif
837
838#define CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE \
839  (2 * CONFIGURE_MINIMUM_TASK_STACK_SIZE)
840
841/**
842 * @brief Idle task stack size configuration.
843 *
844 * By default, the IDLE task will have a stack of minimum size.
845 * The BSP or application may override this value.
846 */
847#ifndef CONFIGURE_IDLE_TASK_STACK_SIZE
848  #ifdef BSP_IDLE_TASK_STACK_SIZE
849    #define CONFIGURE_IDLE_TASK_STACK_SIZE BSP_IDLE_TASK_STACK_SIZE
850  #else
851    #define CONFIGURE_IDLE_TASK_STACK_SIZE CONFIGURE_MINIMUM_TASK_STACK_SIZE
852  #endif
853#endif
854#if CONFIGURE_IDLE_TASK_STACK_SIZE < CONFIGURE_MINIMUM_TASK_STACK_SIZE
855  #error "CONFIGURE_IDLE_TASK_STACK_SIZE less than CONFIGURE_MINIMUM_TASK_STACK_SIZE"
856#endif
857
858/**
859 * @brief Interrupt stack size configuration.
860 *
861 * By default, the interrupt stack will be of minimum size.
862 * The BSP or application may override this value.
863 */
864#ifndef CONFIGURE_INTERRUPT_STACK_SIZE
865  #ifdef BSP_INTERRUPT_STACK_SIZE
866    #define CONFIGURE_INTERRUPT_STACK_SIZE BSP_INTERRUPT_STACK_SIZE
867  #else
868    #define CONFIGURE_INTERRUPT_STACK_SIZE CONFIGURE_MINIMUM_TASK_STACK_SIZE
869  #endif
870#endif
871
872/**
873 * This reserves memory for the interrupt stack if it is to be allocated
874 * by RTEMS rather than the BSP.
875 *
876 * @todo Try to get to the point where all BSPs support allocating the
877 *       memory from the Workspace.
878 */
879#if (CPU_ALLOCATE_INTERRUPT_STACK == 0)
880  #define CONFIGURE_INTERRUPT_STACK_MEMORY 0
881#else
882  #define CONFIGURE_INTERRUPT_STACK_MEMORY \
883     _Configure_From_workspace( CONFIGURE_INTERRUPT_STACK_SIZE )
884#endif
885
886/**
887 * Configure the very much optional task stack allocator initialization
888 */
889#ifndef CONFIGURE_TASK_STACK_ALLOCATOR_INIT
890  #define CONFIGURE_TASK_STACK_ALLOCATOR_INIT NULL
891#endif
892
893/*
894 *  Configure the very much optional task stack allocator and deallocator.
895 */
896#if !defined(CONFIGURE_TASK_STACK_ALLOCATOR) \
897  && !defined(CONFIGURE_TASK_STACK_DEALLOCATOR)
898  #define CONFIGURE_TASK_STACK_ALLOCATOR _Workspace_Allocate
899  #define CONFIGURE_TASK_STACK_DEALLOCATOR _Workspace_Free
900#elif (defined(CONFIGURE_TASK_STACK_ALLOCATOR) \
901  && !defined(CONFIGURE_TASK_STACK_DEALLOCATOR)) \
902    || (!defined(CONFIGURE_TASK_STACK_ALLOCATOR) \
903      && defined(CONFIGURE_TASK_STACK_DEALLOCATOR))
904  #error "CONFIGURE_TASK_STACK_ALLOCATOR and CONFIGURE_TASK_STACK_DEALLOCATOR must be both defined or both undefined"
905#endif
906
907/**
908 * Should the RTEMS Workspace and C Program Heap be cleared automatically
909 * at system start up?
910 */
911#ifndef CONFIGURE_ZERO_WORKSPACE_AUTOMATICALLY
912  #ifdef BSP_ZERO_WORKSPACE_AUTOMATICALLY
913    #define CONFIGURE_ZERO_WORKSPACE_AUTOMATICALLY \
914            BSP_ZERO_WORKSPACE_AUTOMATICALLY
915  #else
916    #define CONFIGURE_ZERO_WORKSPACE_AUTOMATICALLY FALSE
917  #endif
918#endif
919
920/*
921 *  RTEMS Malloc configuration
922 */
923
924#include <rtems/malloc.h>
925
926#ifdef CONFIGURE_INIT
927  /**
928   * By default, RTEMS uses separate heaps for the RTEMS Workspace and
929   * the C Program Heap.  The application can choose optionally to combine
930   * these to provide one larger memory pool. This is particularly
931   * useful in combination with the unlimited objects configuration.
932   */
933  #ifdef CONFIGURE_UNIFIED_WORK_AREAS
934    Heap_Control  *RTEMS_Malloc_Heap = &_Workspace_Area;
935  #else
936    Heap_Control   RTEMS_Malloc_Area;
937    Heap_Control  *RTEMS_Malloc_Heap = &RTEMS_Malloc_Area;
938  #endif
939#endif
940
941#ifdef CONFIGURE_INIT
942  /**
943   * This configures the malloc family statistics to be available.
944   * By default only function call counts are kept.
945   */
946  rtems_malloc_statistics_functions_t *rtems_malloc_statistics_helpers =
947    #ifndef CONFIGURE_MALLOC_STATISTICS
948      NULL;
949    #else
950      &rtems_malloc_statistics_helpers_table;
951    #endif
952#endif
953
954#ifdef CONFIGURE_INIT
955  /**
956   * This configures the sbrk() support for the malloc family.
957   * By default it is assumed that the BSP provides all available
958   * RAM to the malloc family implementation so sbrk()'ing to get
959   * more memory would always fail anyway.
960   */
961  const rtems_heap_extend_handler rtems_malloc_extend_handler =
962    #ifdef CONFIGURE_MALLOC_BSP_SUPPORTS_SBRK
963      rtems_heap_extend_via_sbrk;
964    #else
965      rtems_heap_null_extend;
966    #endif
967#endif
968
969#ifdef CONFIGURE_INIT
970  /**
971   * This configures the malloc family plugin which dirties memory
972   * allocated.  This is helpful for finding unitialized data structure
973   * problems.
974   */
975  rtems_malloc_dirtier_t rtems_malloc_dirty_helper =
976    #if defined(CONFIGURE_MALLOC_DIRTY)
977      rtems_malloc_dirty_memory;
978    #else
979      NULL;
980    #endif
981#endif
982
983/**
984 * Zero of one returns 0 if the parameter is 0 else 1 is returned.
985 */
986#define _Configure_Zero_or_One(_number) ((_number) ? 1 : 0)
987
988#define _Configure_Align_up(_val, _align) \
989  (((_val) + (_align) - 1) & ~((_align) - 1))
990
991/**
992 * This is a helper macro used in calculations in this file.  It is used
993 * to noted when an element is allocated from the RTEMS Workspace and adds
994 * a factor to account for heap overhead plus an alignment factor that
995 * may be applied.
996 */
997#define _Configure_From_workspace(_size) \
998   (ssize_t) (_Configure_Zero_or_One(_size) * \
999     _Configure_Align_up((_size) + HEAP_BLOCK_HEADER_SIZE, CPU_HEAP_ALIGNMENT))
1000
1001/**
1002 * This is a helper macro used in stack space calculations in this file.  It
1003 * may be provided by the application in case a special task stack allocator
1004 * is used.  The default is allocation from the RTEMS Workspace.
1005 */
1006#ifdef CONFIGURE_TASK_STACK_FROM_ALLOCATOR
1007  #define _Configure_From_stackspace(_stack_size) \
1008    CONFIGURE_TASK_STACK_FROM_ALLOCATOR(_stack_size)
1009#else
1010  #define _Configure_From_stackspace(_stack_size) \
1011    _Configure_From_workspace(_stack_size)
1012#endif
1013
1014/**
1015 * Do not use the unlimited bit as part of the multiplication
1016 * for memory usage.
1017 */
1018#define _Configure_Max_Objects(_max) \
1019  (_Configure_Zero_or_One(_max) * rtems_resource_maximum_per_allocation(_max))
1020
1021/**
1022 * This macro accounts for how memory for a set of configured objects is
1023 * allocated from the Executive Workspace.
1024 *
1025 * NOTE: It does NOT attempt to address the more complex case of unlimited
1026 *       objects.
1027 */
1028#define _Configure_Object_RAM(_number, _size) ( \
1029    _Configure_From_workspace(_Configure_Max_Objects(_number) * (_size)) + \
1030    _Configure_From_workspace( \
1031      _Configure_Zero_or_One(_number) * ( \
1032        (_Configure_Max_Objects(_number) + 1) * sizeof(Objects_Control *) + \
1033        _Configure_Align_up(sizeof(void *), CPU_ALIGNMENT) + \
1034        _Configure_Align_up(sizeof(uint32_t), CPU_ALIGNMENT) \
1035      ) \
1036    ) \
1037  )
1038
1039/*
1040 *  Default User Initialization Task Table.  This table guarantees that
1041 *  one user initialization table is defined.
1042 */
1043
1044#ifdef CONFIGURE_RTEMS_INIT_TASKS_TABLE
1045
1046#ifdef CONFIGURE_HAS_OWN_INIT_TASK_TABLE
1047
1048/*
1049 *  The user is defining their own table information and setting the
1050 *  appropriate variables.
1051 */
1052
1053#else
1054
1055#ifndef CONFIGURE_INIT_TASK_NAME
1056  #define CONFIGURE_INIT_TASK_NAME          rtems_build_name('U', 'I', '1', ' ')
1057#endif
1058
1059#ifndef CONFIGURE_INIT_TASK_STACK_SIZE
1060  #define CONFIGURE_INIT_TASK_STACK_SIZE    CONFIGURE_MINIMUM_TASK_STACK_SIZE
1061#endif
1062
1063#ifndef CONFIGURE_INIT_TASK_PRIORITY
1064  #define CONFIGURE_INIT_TASK_PRIORITY      1
1065#endif
1066
1067#ifndef CONFIGURE_INIT_TASK_ATTRIBUTES
1068  #define CONFIGURE_INIT_TASK_ATTRIBUTES    RTEMS_DEFAULT_ATTRIBUTES
1069#endif
1070
1071#ifndef CONFIGURE_INIT_TASK_ENTRY_POINT
1072  #ifdef __cplusplus
1073  extern "C" {
1074  #endif
1075    rtems_task Init (rtems_task_argument );
1076  #ifdef __cplusplus
1077  }
1078  #endif
1079  #define CONFIGURE_INIT_TASK_ENTRY_POINT   Init
1080  extern const char* bsp_boot_cmdline;
1081  #define CONFIGURE_INIT_TASK_ARGUMENTS     ((rtems_task_argument) &bsp_boot_cmdline)
1082#endif
1083
1084#ifndef CONFIGURE_INIT_TASK_INITIAL_MODES
1085  #if defined(RTEMS_SMP) && defined(CONFIGURE_SMP_APPLICATION)
1086    #define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES
1087  #else
1088    #define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_NO_PREEMPT
1089  #endif
1090#endif
1091
1092#ifndef CONFIGURE_INIT_TASK_ARGUMENTS
1093  #define CONFIGURE_INIT_TASK_ARGUMENTS     0
1094#endif
1095
1096#ifdef CONFIGURE_INIT
1097  rtems_initialization_tasks_table Initialization_tasks[] = {
1098    { CONFIGURE_INIT_TASK_NAME,
1099      CONFIGURE_INIT_TASK_STACK_SIZE,
1100      CONFIGURE_INIT_TASK_PRIORITY,
1101      CONFIGURE_INIT_TASK_ATTRIBUTES,
1102      CONFIGURE_INIT_TASK_ENTRY_POINT,
1103      CONFIGURE_INIT_TASK_INITIAL_MODES,
1104      CONFIGURE_INIT_TASK_ARGUMENTS
1105    }
1106  };
1107#endif
1108
1109#define CONFIGURE_INIT_TASK_TABLE Initialization_tasks
1110
1111#define CONFIGURE_INIT_TASK_TABLE_SIZE \
1112  RTEMS_ARRAY_SIZE(CONFIGURE_INIT_TASK_TABLE)
1113
1114#endif    /* CONFIGURE_HAS_OWN_INIT_TASK_TABLE */
1115
1116#else     /* CONFIGURE_RTEMS_INIT_TASKS_TABLE */
1117
1118#define CONFIGURE_INIT_TASK_TABLE      NULL
1119#define CONFIGURE_INIT_TASK_TABLE_SIZE 0
1120#define CONFIGURE_INIT_TASK_STACK_SIZE 0
1121
1122#endif
1123
1124/*
1125 *  Default Device Driver Table.  Each driver needed by the test is explicitly
1126 *  choosen by that test.  There is always a null driver entry.
1127 */
1128
1129#define NULL_DRIVER_TABLE_ENTRY \
1130 { NULL, NULL, NULL, NULL, NULL, NULL }
1131
1132#ifdef CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
1133  #include <rtems/console.h>
1134#endif
1135
1136#ifdef CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
1137  #include <rtems/clockdrv.h>
1138#endif
1139
1140#ifdef CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER
1141  #include <rtems/timerdrv.h>
1142#endif
1143
1144#ifdef CONFIGURE_APPLICATION_NEEDS_RTC_DRIVER
1145  #include <rtems/rtc.h>
1146#endif
1147
1148#ifdef CONFIGURE_APPLICATION_NEEDS_WATCHDOG_DRIVER
1149  #include <rtems/watchdogdrv.h>
1150#endif
1151
1152#ifdef CONFIGURE_APPLICATION_NEEDS_FRAME_BUFFER_DRIVER
1153  #include <rtems/framebuffer.h>
1154#endif
1155
1156#ifdef CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER
1157  #include <rtems/devnull.h>
1158#endif
1159
1160#ifdef CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER
1161  #include <rtems/devzero.h>
1162#endif
1163
1164#ifdef CONFIGURE_APPLICATION_NEEDS_IDE_DRIVER
1165  /* the ide driver needs the ATA driver */
1166  #ifndef CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER
1167    #define CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER
1168  #endif
1169  #include <libchip/ide_ctrl.h>
1170#endif
1171
1172#ifdef CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER
1173  #include <libchip/ata.h>
1174#endif
1175
1176#ifndef CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE
1177
1178/**
1179 * This specifies the maximum number of device drivers that
1180 * can be installed in the system at one time.  It must account
1181 * for both the statically and dynamically installed drivers.
1182 */
1183#ifndef CONFIGURE_MAXIMUM_DRIVERS
1184  #define CONFIGURE_MAXIMUM_DRIVERS
1185#endif
1186
1187#ifdef CONFIGURE_INIT
1188  rtems_driver_address_table
1189    _IO_Driver_address_table[ CONFIGURE_MAXIMUM_DRIVERS ] = {
1190    #ifdef CONFIGURE_BSP_PREREQUISITE_DRIVERS
1191      CONFIGURE_BSP_PREREQUISITE_DRIVERS,
1192    #endif
1193    #ifdef CONFIGURE_APPLICATION_PREREQUISITE_DRIVERS
1194      CONFIGURE_APPLICATION_PREREQUISITE_DRIVERS,
1195    #endif
1196    #ifdef CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
1197      CONSOLE_DRIVER_TABLE_ENTRY,
1198    #endif
1199    #ifdef CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
1200      CLOCK_DRIVER_TABLE_ENTRY,
1201    #endif
1202    #ifdef CONFIGURE_APPLICATION_NEEDS_RTC_DRIVER
1203      RTC_DRIVER_TABLE_ENTRY,
1204    #endif
1205    #ifdef CONFIGURE_APPLICATION_NEEDS_WATCHDOG_DRIVER
1206      WATCHDOG_DRIVER_TABLE_ENTRY,
1207    #endif
1208    #ifdef CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER
1209      DEVNULL_DRIVER_TABLE_ENTRY,
1210    #endif
1211    #ifdef CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER
1212      DEVZERO_DRIVER_TABLE_ENTRY,
1213    #endif
1214    #ifdef CONFIGURE_APPLICATION_NEEDS_IDE_DRIVER
1215      IDE_CONTROLLER_DRIVER_TABLE_ENTRY,
1216    #endif
1217    #ifdef CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER
1218      ATA_DRIVER_TABLE_ENTRY,
1219    #endif
1220    #ifdef CONFIGURE_APPLICATION_NEEDS_FRAME_BUFFER_DRIVER
1221      FRAME_BUFFER_DRIVER_TABLE_ENTRY,
1222    #endif
1223    #ifdef CONFIGURE_APPLICATION_EXTRA_DRIVERS
1224      CONFIGURE_APPLICATION_EXTRA_DRIVERS,
1225    #endif
1226    #ifdef CONFIGURE_APPLICATION_NEEDS_NULL_DRIVER
1227      NULL_DRIVER_TABLE_ENTRY
1228    #elif !defined(CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER) && \
1229        !defined(CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER) && \
1230        !defined(CONFIGURE_APPLICATION_NEEDS_RTC_DRIVER) && \
1231        !defined(CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER) && \
1232        !defined(CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER) && \
1233        !defined(CONFIGURE_APPLICATION_NEEDS_IDE_DRIVER) && \
1234        !defined(CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER) && \
1235        !defined(CONFIGURE_APPLICATION_NEEDS_FRAME_BUFFER_DRIVER) && \
1236        !defined(CONFIGURE_APPLICATION_EXTRA_DRIVERS)
1237      NULL_DRIVER_TABLE_ENTRY
1238    #endif
1239  };
1240
1241  const size_t _IO_Number_of_drivers =
1242    RTEMS_ARRAY_SIZE( _IO_Driver_address_table );
1243#endif
1244
1245#endif  /* CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE */
1246
1247#ifdef CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER
1248  /*
1249   * configure the priority of the ATA driver task
1250   */
1251  #ifndef CONFIGURE_ATA_DRIVER_TASK_PRIORITY
1252    #define CONFIGURE_ATA_DRIVER_TASK_PRIORITY ATA_DRIVER_TASK_DEFAULT_PRIORITY
1253  #endif
1254  #ifdef CONFIGURE_INIT
1255    rtems_task_priority rtems_ata_driver_task_priority
1256      = CONFIGURE_ATA_DRIVER_TASK_PRIORITY;
1257  #endif /* CONFIGURE_INIT */
1258#endif
1259
1260/*
1261 * add bdbuf configuration and values for swapout task priority
1262 */
1263#ifdef CONFIGURE_APPLICATION_NEEDS_LIBBLOCK
1264  #include <rtems/bdbuf.h>
1265  /*
1266   * configure the bdbuf cache parameters
1267   */
1268  #ifndef CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS
1269    #define CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS \
1270                              RTEMS_BDBUF_MAX_READ_AHEAD_BLOCKS_DEFAULT
1271  #endif
1272  #ifndef CONFIGURE_BDBUF_MAX_WRITE_BLOCKS
1273    #define CONFIGURE_BDBUF_MAX_WRITE_BLOCKS \
1274                              RTEMS_BDBUF_MAX_WRITE_BLOCKS_DEFAULT
1275  #endif
1276  #ifndef CONFIGURE_SWAPOUT_TASK_PRIORITY
1277    #define CONFIGURE_SWAPOUT_TASK_PRIORITY \
1278                              RTEMS_BDBUF_SWAPOUT_TASK_PRIORITY_DEFAULT
1279  #endif
1280  #ifndef CONFIGURE_SWAPOUT_SWAP_PERIOD
1281    #define CONFIGURE_SWAPOUT_SWAP_PERIOD \
1282                              RTEMS_BDBUF_SWAPOUT_TASK_SWAP_PERIOD_DEFAULT
1283  #endif
1284  #ifndef CONFIGURE_SWAPOUT_BLOCK_HOLD
1285    #define CONFIGURE_SWAPOUT_BLOCK_HOLD \
1286                              RTEMS_BDBUF_SWAPOUT_TASK_BLOCK_HOLD_DEFAULT
1287  #endif
1288  #ifndef CONFIGURE_SWAPOUT_WORKER_TASKS
1289    #define CONFIGURE_SWAPOUT_WORKER_TASKS \
1290                              RTEMS_BDBUF_SWAPOUT_WORKER_TASKS_DEFAULT
1291  #endif
1292  #ifndef CONFIGURE_SWAPOUT_WORKER_TASK_PRIORITY
1293    #define CONFIGURE_SWAPOUT_WORKER_TASK_PRIORITY \
1294                              RTEMS_BDBUF_SWAPOUT_WORKER_TASK_PRIORITY_DEFAULT
1295  #endif
1296  #ifndef CONFIGURE_BDBUF_TASK_STACK_SIZE
1297    #define CONFIGURE_BDBUF_TASK_STACK_SIZE \
1298                              RTEMS_BDBUF_TASK_STACK_SIZE_DEFAULT
1299  #endif
1300  #ifndef CONFIGURE_BDBUF_CACHE_MEMORY_SIZE
1301    #define CONFIGURE_BDBUF_CACHE_MEMORY_SIZE \
1302                              RTEMS_BDBUF_CACHE_MEMORY_SIZE_DEFAULT
1303  #endif
1304  #ifndef CONFIGURE_BDBUF_BUFFER_MIN_SIZE
1305    #define CONFIGURE_BDBUF_BUFFER_MIN_SIZE \
1306                              RTEMS_BDBUF_BUFFER_MIN_SIZE_DEFAULT
1307  #endif
1308  #ifndef CONFIGURE_BDBUF_BUFFER_MAX_SIZE
1309    #define CONFIGURE_BDBUF_BUFFER_MAX_SIZE \
1310                              RTEMS_BDBUF_BUFFER_MAX_SIZE_DEFAULT
1311  #endif
1312  #ifndef CONFIGURE_BDBUF_READ_AHEAD_TASK_PRIORITY
1313    #define CONFIGURE_BDBUF_READ_AHEAD_TASK_PRIORITY \
1314                              RTEMS_BDBUF_READ_AHEAD_TASK_PRIORITY_DEFAULT
1315  #endif
1316  #ifdef CONFIGURE_INIT
1317    const rtems_bdbuf_config rtems_bdbuf_configuration = {
1318      CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS,
1319      CONFIGURE_BDBUF_MAX_WRITE_BLOCKS,
1320      CONFIGURE_SWAPOUT_TASK_PRIORITY,
1321      CONFIGURE_SWAPOUT_SWAP_PERIOD,
1322      CONFIGURE_SWAPOUT_BLOCK_HOLD,
1323      CONFIGURE_SWAPOUT_WORKER_TASKS,
1324      CONFIGURE_SWAPOUT_WORKER_TASK_PRIORITY,
1325      CONFIGURE_BDBUF_TASK_STACK_SIZE,
1326      CONFIGURE_BDBUF_CACHE_MEMORY_SIZE,
1327      CONFIGURE_BDBUF_BUFFER_MIN_SIZE,
1328      CONFIGURE_BDBUF_BUFFER_MAX_SIZE,
1329      CONFIGURE_BDBUF_READ_AHEAD_TASK_PRIORITY
1330    };
1331  #endif
1332
1333  #define CONFIGURE_LIBBLOCK_TASKS \
1334    (1 + CONFIGURE_SWAPOUT_WORKER_TASKS + \
1335    (CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS != 0))
1336
1337  #define CONFIGURE_LIBBLOCK_TASK_EXTRA_STACKS \
1338    (CONFIGURE_LIBBLOCK_TASKS * \
1339    (CONFIGURE_BDBUF_TASK_STACK_SIZE <= CONFIGURE_MINIMUM_TASK_STACK_SIZE ? \
1340    0 : CONFIGURE_BDBUF_TASK_STACK_SIZE - CONFIGURE_MINIMUM_TASK_STACK_SIZE))
1341
1342  /*
1343   *  Semaphores:
1344   *    o disk lock
1345   *    o bdbuf lock
1346   *    o bdbuf sync lock
1347   *    o bdbuf access condition
1348   *    o bdbuf transfer condition
1349   *    o bdbuf buffer condition
1350   */
1351  #define CONFIGURE_LIBBLOCK_SEMAPHORES 6
1352
1353  #if defined(CONFIGURE_HAS_OWN_BDBUF_TABLE) || \
1354      defined(CONFIGURE_BDBUF_BUFFER_SIZE) || \
1355      defined(CONFIGURE_BDBUF_BUFFER_COUNT)
1356    #error BDBUF Cache does not use a buffer configuration table. Please remove.
1357  #endif
1358#else
1359  #define CONFIGURE_LIBBLOCK_TASKS 0
1360  #define CONFIGURE_LIBBLOCK_TASK_EXTRA_STACKS 0
1361  #define CONFIGURE_LIBBLOCK_SEMAPHORES 0
1362#endif /* CONFIGURE_APPLICATION_NEEDS_LIBBLOCK */
1363
1364#ifndef CONFIGURE_EXTRA_MPCI_RECEIVE_SERVER_STACK
1365  #define CONFIGURE_EXTRA_MPCI_RECEIVE_SERVER_STACK 0
1366#endif
1367
1368#if defined(RTEMS_MULTIPROCESSING)
1369  /*
1370   *  Default Multiprocessing Configuration Table.  The defaults are
1371   *  appropriate for most of the RTEMS Multiprocessor Test Suite.  Each
1372   *  value may be overridden within each test to customize the environment.
1373   */
1374
1375  #ifdef CONFIGURE_MP_APPLICATION
1376    #define CONFIGURE_TIMER_FOR_SHARED_MEMORY_DRIVER 1
1377
1378    #ifndef CONFIGURE_HAS_OWN_MULTIPROCESSING_TABLE
1379
1380      #ifndef CONFIGURE_MP_NODE_NUMBER
1381        #define CONFIGURE_MP_NODE_NUMBER                NODE_NUMBER
1382      #endif
1383
1384      #ifndef CONFIGURE_MP_MAXIMUM_NODES
1385        #define CONFIGURE_MP_MAXIMUM_NODES              2
1386      #endif
1387
1388      #ifndef CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS
1389        #define CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS     32
1390      #endif
1391      #define CONFIGURE_MEMORY_FOR_GLOBAL_OBJECTS(_global_objects) \
1392        _Configure_Object_RAM((_global_objects), sizeof(Objects_MP_Control))
1393
1394      #ifndef CONFIGURE_MP_MAXIMUM_PROXIES
1395        #define CONFIGURE_MP_MAXIMUM_PROXIES            32
1396      #endif
1397      #define CONFIGURE_MEMORY_FOR_PROXIES(_proxies) \
1398        _Configure_Object_RAM((_proxies) + 1, sizeof(Thread_Proxy_control) )
1399
1400      #ifndef CONFIGURE_MP_MPCI_TABLE_POINTER
1401        #include <mpci.h>
1402        #define CONFIGURE_MP_MPCI_TABLE_POINTER         &MPCI_table
1403      #endif
1404
1405      #ifdef CONFIGURE_INIT
1406        rtems_multiprocessing_table Multiprocessing_configuration = {
1407          CONFIGURE_MP_NODE_NUMBER,               /* local node number */
1408          CONFIGURE_MP_MAXIMUM_NODES,             /* maximum # nodes */
1409          CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS,    /* maximum # global objects */
1410          CONFIGURE_MP_MAXIMUM_PROXIES,           /* maximum # proxies */
1411          CONFIGURE_EXTRA_MPCI_RECEIVE_SERVER_STACK, /* MPCI stack > minimum */
1412          CONFIGURE_MP_MPCI_TABLE_POINTER         /* ptr to MPCI config table */
1413        };
1414      #endif
1415
1416      #define CONFIGURE_MULTIPROCESSING_TABLE    &Multiprocessing_configuration
1417
1418    #endif /* CONFIGURE_HAS_OWN_MULTIPROCESSING_TABLE */
1419
1420  #else
1421
1422    #define CONFIGURE_MULTIPROCESSING_TABLE    NULL
1423
1424  #endif /* CONFIGURE_MP_APPLICATION */
1425#endif /* RTEMS_MULTIPROCESSING */
1426
1427#ifndef CONFIGURE_TIMER_FOR_SHARED_MEMORY_DRIVER
1428  #define CONFIGURE_TIMER_FOR_SHARED_MEMORY_DRIVER 0
1429#endif
1430
1431
1432/**
1433 * This macro specifies that the user wants to use unlimited objects for any
1434 * classic or posix objects that have not already been given resource limits.
1435 */
1436#if defined(CONFIGURE_UNLIMITED_OBJECTS)
1437  #if !defined(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1438  /**
1439   * This macro specifies a default allocation size for when auto-extending
1440   * unlimited objects if none was given by the user.
1441   */
1442    #define CONFIGURE_UNLIMITED_ALLOCATION_SIZE 8
1443  #endif
1444  #if !defined(CONFIGURE_MAXIMUM_TASKS)
1445    #define CONFIGURE_MAXIMUM_TASKS \
1446      rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1447  #endif
1448  #if !defined(CONFIGURE_MAXIMUM_TIMERS)
1449    #define CONFIGURE_MAXIMUM_TIMERS \
1450      rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1451  #endif
1452  #if !defined(CONFIGURE_MAXIMUM_SEMAPHORES)
1453    #define CONFIGURE_MAXIMUM_SEMAPHORES \
1454      rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1455  #endif
1456  #if !defined(CONFIGURE_MAXIMUM_MESSAGE_QUEUES)
1457    #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES \
1458      rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1459  #endif
1460  #if !defined(CONFIGURE_MAXIMUM_PARTITIONS)
1461    #define CONFIGURE_MAXIMUM_PARTITIONS \
1462      rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1463  #endif
1464  #if !defined(CONFIGURE_MAXIMUM_REGIONS)
1465    #define CONFIGURE_MAXIMUM_REGIONS \
1466      rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1467  #endif
1468  #if !defined(CONFIGURE_MAXIMUM_PORTS)
1469    #define CONFIGURE_MAXIMUM_PORTS \
1470      rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1471  #endif
1472  #if !defined(CONFIGURE_MAXIMUM_PERIODS)
1473    #define CONFIGURE_MAXIMUM_PERIODS \
1474      rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1475  #endif
1476  #if !defined(CONFIGURE_MAXIMUM_BARRIERS)
1477    #define CONFIGURE_MAXIMUM_BARRIERS \
1478      rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1479  #endif
1480
1481  #ifdef RTEMS_POSIX_API
1482    #if !defined(CONFIGURE_MAXIMUM_POSIX_THREADS)
1483      #define CONFIGURE_MAXIMUM_POSIX_THREADS \
1484        rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1485    #endif
1486    #if !defined(CONFIGURE_MAXIMUM_POSIX_MUTEXES)
1487      #define CONFIGURE_MAXIMUM_POSIX_MUTEXES \
1488        rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1489    #endif
1490    #if !defined(CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES)
1491      #define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES \
1492        rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1493    #endif
1494/*
1495    #if !defined(CONFIGURE_MAXIMUM_POSIX_KEYS)
1496      #define CONFIGURE_MAXIMUM_POSIX_KEYS \
1497        rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1498    #endif
1499*/
1500    #if !defined(CONFIGURE_MAXIMUM_POSIX_TIMERS)
1501      #define CONFIGURE_MAXIMUM_POSIX_TIMERS \
1502        rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1503    #endif
1504/*
1505    #if !defined(CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS)
1506      #define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS \
1507        rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1508    #endif
1509*/
1510    #if !defined(CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES)
1511      #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES \
1512        rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1513    #endif
1514    #if !defined(CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS)
1515      #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS \
1516        rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1517    #endif
1518    #if !defined(CONFIGURE_MAXIMUM_POSIX_SEMAPHORES)
1519      #define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES \
1520        rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1521    #endif
1522    #if !defined(CONFIGURE_MAXIMUM_POSIX_BARRIERS)
1523      #define CONFIGURE_MAXIMUM_POSIX_BARRIERS \
1524        rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1525    #endif
1526    #if !defined(CONFIGURE_MAXIMUM_POSIX_RWLOCKS)
1527      #define CONFIGURE_MAXIMUM_POSIX_RWLOCKS \
1528        rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1529    #endif
1530    #if !defined(CONFIGURE_MAXIMUM_POSIX_SPINLOCKS)
1531      #define CONFIGURE_MAXIMUM_POSIX_SPINLOCKS \
1532        rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
1533    #endif
1534  #endif /* RTEMS_POSIX_API */
1535#endif /* CONFIGURE_UNLIMITED_OBJECTS */
1536
1537
1538/*
1539 *  Default Configuration Table.
1540 */
1541
1542#ifndef CONFIGURE_HAS_OWN_CONFIGURATION_TABLE
1543
1544  #ifndef CONFIGURE_MAXIMUM_TASKS
1545    #define CONFIGURE_MAXIMUM_TASKS               0
1546  #endif
1547
1548  #define CONFIGURE_TASKS \
1549    (CONFIGURE_MAXIMUM_TASKS + CONFIGURE_LIBBLOCK_TASKS)
1550
1551  #ifndef CONFIGURE_DISABLE_CLASSIC_API_NOTEPADS
1552    #define CONFIGURE_NOTEPADS_ENABLED           TRUE
1553  #else
1554    #define CONFIGURE_NOTEPADS_ENABLED           FALSE
1555  #endif
1556
1557/**
1558 * This macro calculates the memory required for task variables.
1559 *
1560 * Each task variable is individually allocated from the Workspace.
1561 * Hence, we do the multiplication on the configured size.
1562 *
1563 * @note Per-task variables are disabled for SMP configurations.
1564 */
1565#if defined(RTEMS_SMP)
1566  #ifdef CONFIGURE_MAXIMUM_TASK_VARIABLES
1567    #error "Per-Task Variables are not safe for SMP systems and disabled"
1568  #endif
1569  #define CONFIGURE_MAXIMUM_TASK_VARIABLES                     0
1570  #define CONFIGURE_MEMORY_FOR_TASK_VARIABLES(_task_variables) 0
1571#else
1572  #ifndef CONFIGURE_MAXIMUM_TASK_VARIABLES
1573    #define CONFIGURE_MAXIMUM_TASK_VARIABLES                     0
1574    #define CONFIGURE_MEMORY_FOR_TASK_VARIABLES(_task_variables) 0
1575  #else
1576    #define CONFIGURE_MEMORY_FOR_TASK_VARIABLES(_task_variables) \
1577      (_task_variables) * \
1578         _Configure_From_workspace(sizeof(rtems_task_variable_t))
1579  #endif
1580#endif
1581
1582  #ifndef CONFIGURE_MAXIMUM_TIMERS
1583    #define CONFIGURE_MAXIMUM_TIMERS             0
1584    #define CONFIGURE_MEMORY_FOR_TIMERS(_timers) 0
1585  #else
1586    #define CONFIGURE_MEMORY_FOR_TIMERS(_timers) \
1587      _Configure_Object_RAM(_timers, sizeof(Timer_Control) )
1588  #endif
1589
1590  #ifndef CONFIGURE_MAXIMUM_SEMAPHORES
1591    #define CONFIGURE_MAXIMUM_SEMAPHORES                 0
1592  #endif
1593
1594  #define CONFIGURE_SEMAPHORES \
1595    (CONFIGURE_MAXIMUM_SEMAPHORES + CONFIGURE_LIBIO_SEMAPHORES + \
1596      CONFIGURE_TERMIOS_SEMAPHORES + CONFIGURE_LIBBLOCK_SEMAPHORES + \
1597      CONFIGURE_SEMAPHORES_FOR_FIFOS)
1598
1599  /*
1600   * If there are no user or support semaphores defined, then we can assume
1601   * that no memory need be allocated at all for semaphores.
1602   */
1603  #if CONFIGURE_SEMAPHORES == 0
1604    #define CONFIGURE_MEMORY_FOR_SEMAPHORES(_semaphores) 0
1605  #else
1606    #define CONFIGURE_MEMORY_FOR_SEMAPHORES(_semaphores) \
1607      _Configure_Object_RAM(_semaphores, sizeof(Semaphore_Control) )
1608  #endif
1609
1610  #ifndef CONFIGURE_MAXIMUM_MESSAGE_QUEUES
1611    #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES             0
1612    #define CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(_queues) 0
1613  #else
1614    #define CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(_queues) \
1615      _Configure_Object_RAM(_queues, sizeof(Message_queue_Control) )
1616  #endif
1617
1618  #ifndef CONFIGURE_MAXIMUM_PARTITIONS
1619    #define CONFIGURE_MAXIMUM_PARTITIONS                 0
1620    #define CONFIGURE_MEMORY_FOR_PARTITIONS(_partitions) 0
1621  #else
1622    #define CONFIGURE_MEMORY_FOR_PARTITIONS(_partitions) \
1623      _Configure_Object_RAM(_partitions, sizeof(Partition_Control) )
1624  #endif
1625
1626  #ifndef CONFIGURE_MAXIMUM_REGIONS
1627    #define CONFIGURE_MAXIMUM_REGIONS              0
1628    #define CONFIGURE_MEMORY_FOR_REGIONS(_regions) 0
1629  #else
1630    #define CONFIGURE_MEMORY_FOR_REGIONS(_regions) \
1631      _Configure_Object_RAM(_regions, sizeof(Region_Control) )
1632  #endif
1633
1634  #ifndef CONFIGURE_MAXIMUM_PORTS
1635    #define CONFIGURE_MAXIMUM_PORTS            0
1636    #define CONFIGURE_MEMORY_FOR_PORTS(_ports) 0
1637  #else
1638    #define CONFIGURE_MEMORY_FOR_PORTS(_ports) \
1639      _Configure_Object_RAM(_ports, sizeof(Dual_ported_memory_Control) )
1640  #endif
1641
1642  #ifndef CONFIGURE_MAXIMUM_PERIODS
1643    #define CONFIGURE_MAXIMUM_PERIODS              0
1644    #define CONFIGURE_MEMORY_FOR_PERIODS(_periods) 0
1645  #else
1646    #define CONFIGURE_MEMORY_FOR_PERIODS(_periods) \
1647      _Configure_Object_RAM(_periods, sizeof(Rate_monotonic_Control) )
1648  #endif
1649
1650  #ifndef CONFIGURE_MAXIMUM_BARRIERS
1651    #define CONFIGURE_MAXIMUM_BARRIERS               0
1652  #endif
1653
1654  #define CONFIGURE_BARRIERS \
1655     (CONFIGURE_MAXIMUM_BARRIERS + CONFIGURE_BARRIERS_FOR_FIFOS)
1656
1657  #if CONFIGURE_BARRIERS == 0
1658    #define CONFIGURE_MEMORY_FOR_BARRIERS(_barriers) 0
1659  #else
1660    #define CONFIGURE_MEMORY_FOR_BARRIERS(_barriers) \
1661      _Configure_Object_RAM(_barriers, sizeof(Barrier_Control) )
1662  #endif
1663
1664  #ifndef CONFIGURE_MAXIMUM_USER_EXTENSIONS
1665    #define CONFIGURE_MAXIMUM_USER_EXTENSIONS                 0
1666    #define CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(_extensions) 0
1667  #else
1668    #define CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(_extensions) \
1669      _Configure_Object_RAM(_extensions, sizeof(Extension_Control) )
1670  #endif
1671
1672  #ifndef CONFIGURE_MICROSECONDS_PER_TICK
1673    #define CONFIGURE_MICROSECONDS_PER_TICK \
1674            RTEMS_MILLISECONDS_TO_MICROSECONDS(10)
1675  #endif
1676
1677  #ifndef CONFIGURE_TICKS_PER_TIMESLICE
1678    #define CONFIGURE_TICKS_PER_TIMESLICE        50
1679  #endif
1680
1681/*
1682 *  Initial Extension Set
1683 */
1684
1685#ifdef CONFIGURE_INIT
1686#ifdef CONFIGURE_STACK_CHECKER_ENABLED
1687#include <rtems/stackchk.h>
1688#endif
1689#include <rtems/libcsupport.h>
1690
1691#if defined(BSP_INITIAL_EXTENSION) || \
1692    defined(CONFIGURE_INITIAL_EXTENSIONS) || \
1693    defined(CONFIGURE_STACK_CHECKER_ENABLED) || \
1694    (defined(RTEMS_NEWLIB) && !defined(CONFIGURE_DISABLE_NEWLIB_REENTRANCY))
1695  static const rtems_extensions_table Configuration_Initial_Extensions[] = {
1696    #if !defined(CONFIGURE_DISABLE_NEWLIB_REENTRANCY)
1697      RTEMS_NEWLIB_EXTENSION,
1698    #endif
1699    #if defined(CONFIGURE_STACK_CHECKER_ENABLED)
1700      RTEMS_STACK_CHECKER_EXTENSION,
1701    #endif
1702    #if defined(CONFIGURE_INITIAL_EXTENSIONS)
1703      CONFIGURE_INITIAL_EXTENSIONS,
1704    #endif
1705    #if defined(BSP_INITIAL_EXTENSION)
1706      BSP_INITIAL_EXTENSION
1707    #endif
1708  };
1709
1710  #define CONFIGURE_INITIAL_EXTENSION_TABLE Configuration_Initial_Extensions
1711  #define CONFIGURE_NUMBER_OF_INITIAL_EXTENSIONS \
1712    RTEMS_ARRAY_SIZE(Configuration_Initial_Extensions)
1713#else
1714  #define CONFIGURE_INITIAL_EXTENSION_TABLE NULL
1715  #define CONFIGURE_NUMBER_OF_INITIAL_EXTENSIONS 0
1716#endif
1717
1718#if defined(RTEMS_NEWLIB) && defined(__DYNAMIC_REENT__)
1719  struct _reent *__getreent(void)
1720  {
1721    #ifdef CONFIGURE_DISABLE_NEWLIB_REENTRANCY
1722      return _GLOBAL_REENT;
1723    #else
1724      return _Thread_Get_executing()->libc_reent;
1725    #endif
1726  }
1727#endif
1728
1729#endif
1730
1731/*
1732 *  POSIX API Configuration Parameters
1733 */
1734
1735/*
1736 *  POSIX Keys are available whether or not the POSIX API is enabled.
1737 */
1738#include <rtems/posix/key.h>
1739
1740#ifndef CONFIGURE_MAXIMUM_POSIX_KEYS
1741  #define CONFIGURE_MAXIMUM_POSIX_KEYS 0
1742#endif
1743
1744#ifndef CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS
1745  #define CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS \
1746    (CONFIGURE_MAXIMUM_POSIX_KEYS * \
1747     (CONFIGURE_MAXIMUM_POSIX_THREADS + CONFIGURE_MAXIMUM_TASKS))
1748#endif
1749
1750#define CONFIGURE_POSIX_KEYS \
1751  (CONFIGURE_MAXIMUM_POSIX_KEYS + CONFIGURE_LIBIO_POSIX_KEYS)
1752
1753#define CONFIGURE_MEMORY_FOR_POSIX_KEYS(_keys, _key_value_pairs) \
1754   (_Configure_Object_RAM(_keys, sizeof(POSIX_Keys_Control) ) \
1755    + _Configure_From_workspace( \
1756        _key_value_pairs * sizeof(POSIX_Keys_Key_value_pair)))
1757
1758/*
1759 *  The rest of the POSIX threads API features are only available when
1760 *  POSIX is enabled.
1761 */
1762
1763#ifdef RTEMS_POSIX_API
1764  #include <sys/types.h>
1765  #include <signal.h>
1766  #include <limits.h>
1767  #include <mqueue.h>
1768  #include <rtems/posix/barrier.h>
1769  #include <rtems/posix/cond.h>
1770  #include <rtems/posix/mqueue.h>
1771  #include <rtems/posix/mutex.h>
1772  #include <rtems/posix/psignal.h>
1773  #include <rtems/posix/pthread.h>
1774  #include <rtems/posix/rwlock.h>
1775  #include <rtems/posix/semaphore.h>
1776  #include <rtems/posix/spinlock.h>
1777  #include <rtems/posix/threadsup.h>
1778  #include <rtems/posix/timer.h>
1779
1780  /**
1781   * Account for the object control structures plus the name
1782   * of the object to be duplicated.
1783   */
1784  #define _Configure_POSIX_Named_Object_RAM(_number, _size) \
1785    _Configure_Object_RAM( (_number), _size ) + \
1786    (_Configure_Max_Objects(_number) * _Configure_From_workspace(NAME_MAX) )
1787
1788  #ifndef CONFIGURE_MAXIMUM_POSIX_THREADS
1789    #define CONFIGURE_MAXIMUM_POSIX_THREADS 0
1790  #endif
1791
1792  #ifndef CONFIGURE_MAXIMUM_POSIX_MUTEXES
1793    #define CONFIGURE_MAXIMUM_POSIX_MUTEXES 0
1794  #endif
1795  #define CONFIGURE_MEMORY_FOR_POSIX_MUTEXES(_mutexes) \
1796    _Configure_Object_RAM(_mutexes, sizeof(POSIX_Mutex_Control) )
1797
1798  #ifndef CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES
1799    #define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES 0
1800  #endif
1801  #define CONFIGURE_MEMORY_FOR_POSIX_CONDITION_VARIABLES(_condvars) \
1802      _Configure_Object_RAM(_condvars, \
1803                          sizeof(POSIX_Condition_variables_Control) )
1804
1805  #ifndef CONFIGURE_MAXIMUM_POSIX_TIMERS
1806    #define CONFIGURE_MAXIMUM_POSIX_TIMERS 0
1807  #endif
1808  #define CONFIGURE_MEMORY_FOR_POSIX_TIMERS(_timers) \
1809    _Configure_Object_RAM(_timers, sizeof(POSIX_Timer_Control) )
1810
1811  #ifndef CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS
1812    #define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS 0
1813  #endif
1814  #define CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS(_queued_signals) \
1815    _Configure_From_workspace( \
1816      (_queued_signals) * (sizeof(POSIX_signals_Siginfo_node)) )
1817
1818  #ifndef CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES
1819    #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES                     0
1820    #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS          0
1821  #else
1822    /* default to same number */
1823    #ifndef CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS
1824       #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS \
1825               CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES
1826    #endif
1827  #endif
1828
1829  #define CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES(_message_queues) \
1830    _Configure_POSIX_Named_Object_RAM( \
1831       _message_queues, sizeof(POSIX_Message_queue_Control) )
1832
1833  #define CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUE_DESCRIPTORS(_mqueue_fds) \
1834    _Configure_Object_RAM( \
1835       _mqueue_fds, sizeof(POSIX_Message_queue_Control_fd) )
1836
1837  #ifndef CONFIGURE_MAXIMUM_POSIX_SEMAPHORES
1838    #define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES 0
1839  #endif
1840  #define CONFIGURE_MEMORY_FOR_POSIX_SEMAPHORES(_semaphores) \
1841    _Configure_POSIX_Named_Object_RAM( \
1842       _semaphores, sizeof(POSIX_Semaphore_Control) )
1843
1844  #ifndef CONFIGURE_MAXIMUM_POSIX_BARRIERS
1845    #define CONFIGURE_MAXIMUM_POSIX_BARRIERS 0
1846  #endif
1847  #define CONFIGURE_MEMORY_FOR_POSIX_BARRIERS(_barriers) \
1848    _Configure_Object_RAM(_barriers, sizeof(POSIX_Barrier_Control) )
1849
1850  #ifndef CONFIGURE_MAXIMUM_POSIX_SPINLOCKS
1851    #define CONFIGURE_MAXIMUM_POSIX_SPINLOCKS 0
1852  #endif
1853  #define CONFIGURE_MEMORY_FOR_POSIX_SPINLOCKS(_spinlocks) \
1854    _Configure_Object_RAM(_spinlocks, sizeof(POSIX_Spinlock_Control) )
1855
1856  #ifndef CONFIGURE_MAXIMUM_POSIX_RWLOCKS
1857    #define CONFIGURE_MAXIMUM_POSIX_RWLOCKS 0
1858  #endif
1859  #define CONFIGURE_MEMORY_FOR_POSIX_RWLOCKS(_rwlocks) \
1860    _Configure_Object_RAM(_rwlocks, sizeof(POSIX_RWLock_Control) )
1861
1862  #ifdef CONFIGURE_POSIX_INIT_THREAD_TABLE
1863
1864    #ifdef CONFIGURE_POSIX_HAS_OWN_INIT_THREAD_TABLE
1865
1866      /*
1867       *  The user is defining their own table information and setting the
1868       *  appropriate variables for the POSIX Initialization Thread Table.
1869       */
1870
1871    #else
1872
1873      #ifndef CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT
1874        #define CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT   POSIX_Init
1875      #endif
1876
1877      #ifndef CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE
1878        #define CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE \
1879          CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE
1880      #endif
1881
1882      #ifdef CONFIGURE_INIT
1883        posix_initialization_threads_table POSIX_Initialization_threads[] = {
1884          { CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT, \
1885              CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE }
1886        };
1887      #endif
1888
1889      #define CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME \
1890              POSIX_Initialization_threads
1891
1892      #define CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE \
1893              RTEMS_ARRAY_SIZE(CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME)
1894
1895    #endif    /* CONFIGURE_POSIX_HAS_OWN_INIT_TASK_TABLE */
1896
1897  #else     /* CONFIGURE_POSIX_INIT_THREAD_TABLE */
1898
1899    #define CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME NULL
1900    #define CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE 0
1901
1902  #endif
1903
1904  #define CONFIGURE_MEMORY_FOR_POSIX \
1905    ( CONFIGURE_MEMORY_FOR_POSIX_MUTEXES( CONFIGURE_MAXIMUM_POSIX_MUTEXES + \
1906          CONFIGURE_MAXIMUM_GO_CHANNELS + CONFIGURE_GO_INIT_MUTEXES) + \
1907      CONFIGURE_MEMORY_FOR_POSIX_CONDITION_VARIABLES( \
1908          CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES + \
1909          CONFIGURE_MAXIMUM_GO_CHANNELS + CONFIGURE_GO_INIT_CONDITION_VARIABLES) + \
1910      CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS( \
1911          CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS ) + \
1912      CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES( \
1913          CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES ) + \
1914      CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUE_DESCRIPTORS( \
1915          CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS ) + \
1916      CONFIGURE_MEMORY_FOR_POSIX_SEMAPHORES( \
1917          CONFIGURE_MAXIMUM_POSIX_SEMAPHORES ) + \
1918      CONFIGURE_MEMORY_FOR_POSIX_BARRIERS(CONFIGURE_MAXIMUM_POSIX_BARRIERS) + \
1919      CONFIGURE_MEMORY_FOR_POSIX_SPINLOCKS( \
1920          CONFIGURE_MAXIMUM_POSIX_SPINLOCKS ) + \
1921      CONFIGURE_MEMORY_FOR_POSIX_RWLOCKS( \
1922          CONFIGURE_MAXIMUM_POSIX_RWLOCKS ) + \
1923      CONFIGURE_MEMORY_FOR_POSIX_TIMERS( CONFIGURE_MAXIMUM_POSIX_TIMERS ) \
1924     )
1925#else
1926
1927  #define CONFIGURE_MAXIMUM_POSIX_THREADS         0
1928  #define CONFIGURE_MEMORY_FOR_POSIX              0
1929
1930#endif    /* RTEMS_POSIX_API */
1931
1932#ifndef CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE
1933  #define CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE    0
1934#endif
1935
1936/*
1937 *  This block of defines are for applications which use GNAT/RTEMS.
1938 *  GNAT implements each Ada task as a POSIX thread.
1939 */
1940#ifdef CONFIGURE_GNAT_RTEMS
1941
1942  /**
1943   * The GNAT run-time needs something less than (10) POSIX mutexes.
1944   * We may be able to get by with less but why bother.
1945   */
1946  #define CONFIGURE_GNAT_MUTEXES 10
1947
1948  /**
1949   * This is the maximum number of Ada tasks which can be concurrently
1950   * in existence.  Twenty (20) are required to run all tests in the
1951   * ACATS (formerly ACVC).
1952   */
1953  #ifndef CONFIGURE_MAXIMUM_ADA_TASKS
1954    #define CONFIGURE_MAXIMUM_ADA_TASKS  20
1955  #endif
1956
1957  /**
1958   * This is the number of non-Ada tasks which invoked Ada code.
1959   */
1960  #ifndef CONFIGURE_MAXIMUM_FAKE_ADA_TASKS
1961    #define CONFIGURE_MAXIMUM_FAKE_ADA_TASKS 0
1962  #endif
1963
1964#else
1965  #define CONFIGURE_GNAT_MUTEXES           0
1966  #define CONFIGURE_MAXIMUM_ADA_TASKS      0
1967  #define CONFIGURE_MAXIMUM_FAKE_ADA_TASKS 0
1968#endif
1969
1970#ifdef CONFIGURE_ENABLE_GO
1971
1972  #ifndef CONFIGURE_MAXIMUM_POSIX_THREADS
1973    #define CONFIGURE_MAXIMUM_POSIX_THREADS 1
1974  #endif
1975  #ifndef CONFIGURE_MAXIMUM_POSIX_MUTEXES
1976    #define CONFIGURE_MAXIMUM_POSIX_MUTEXES 1
1977  #endif
1978  #ifndef CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES
1979    #define CONFIGURE_MAXIMUM_CONDITION_VARIABLES 1
1980  #endif
1981
1982  #define CONFIGURE_GO_INIT_MUTEXES 77
1983  #define CONFIGURE_GO_INIT_CONDITION_VARIABLES 4
1984
1985  #ifndef CONFIGURE_MAXIMUM_GOROUTINES
1986    #define CONFIGURE_MAXIMUM_GOROUTINES 400
1987  #endif
1988
1989  #define CONFIGURE_GOROUTINES_TASK_VARIABLES \
1990    (2 * CONFIGURE_MAXIMUM_GOROUTINES)
1991
1992  #ifndef CONFIGURE_MAXIMUM_GO_CHANNELS
1993    #define CONFIGURE_MAXIMUM_GO_CHANNELS 500
1994  #endif
1995
1996#else
1997  #define CONFIGURE_GO_INIT_MUTEXES             0
1998  #define CONFIGURE_GO_INIT_CONDITION_VARIABLES 0
1999  #define CONFIGURE_MAXIMUM_GOROUTINES          0
2000  #define CONFIGURE_GOROUTINES_TASK_VARIABLES   0
2001  #define CONFIGURE_MAXIMUM_GO_CHANNELS         0
2002#endif
2003
2004/**
2005 * This is so we can account for tasks with stacks greater than minimum
2006 * size.  This is in bytes.
2007 */
2008#ifndef CONFIGURE_EXTRA_TASK_STACKS
2009  #define CONFIGURE_EXTRA_TASK_STACKS 0
2010#endif
2011
2012/**
2013 * This macro provides a summation of the various POSIX thread requirements.
2014 */
2015#define CONFIGURE_POSIX_THREADS \
2016   (CONFIGURE_MAXIMUM_POSIX_THREADS + \
2017     CONFIGURE_MAXIMUM_ADA_TASKS + \
2018     CONFIGURE_MAXIMUM_GOROUTINES)
2019
2020/*
2021 *  Calculate the RAM size based on the maximum number of objects configured.
2022 */
2023
2024#ifndef CONFIGURE_EXECUTIVE_RAM_SIZE
2025
2026/**
2027 * Account for allocating the following per object
2028 *   + array of object control structures
2029 *   + local pointer table -- pointer per object plus a zero'th
2030 *     entry in the local pointer table.
2031 */
2032
2033#define CONFIGURE_MEMORY_FOR_TASKS(_tasks, _number_FP_tasks) \
2034  ( \
2035    _Configure_Object_RAM(_tasks, sizeof(Configuration_Thread_control)) \
2036      + _Configure_Max_Objects(_number_FP_tasks) \
2037        * _Configure_From_workspace(CONTEXT_FP_SIZE) \
2038        * (CONTEXT_FP_SIZE != 0) \
2039  )
2040
2041/**
2042 * This defines the amount of memory configured for the multiprocessing
2043 * support required by this application.
2044 */
2045#ifdef CONFIGURE_MP_APPLICATION
2046  #define CONFIGURE_MEMORY_FOR_MP \
2047    (CONFIGURE_MEMORY_FOR_PROXIES(CONFIGURE_MP_MAXIMUM_PROXIES) + \
2048     CONFIGURE_MEMORY_FOR_GLOBAL_OBJECTS( \
2049             CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS) + \
2050     CONFIGURE_MEMORY_FOR_TASKS(1, 1) \
2051  )
2052#else
2053  #define CONFIGURE_MEMORY_FOR_MP  0
2054#endif
2055
2056/**
2057 * The following macro is used to calculate the memory allocated by RTEMS
2058 * for the message buffers associated with a particular message queue.
2059 * There is a fixed amount of overhead per message.
2060 */
2061#define CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(_messages, _size) \
2062    _Configure_From_workspace( \
2063      (_messages) * ((_size) + sizeof(CORE_message_queue_Buffer_control)))
2064
2065/**
2066 * This macros is set to the amount of memory required for pending message
2067 * buffers in bytes.  It should be constructed by adding together a
2068 * set of values determined by CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE.
2069 */
2070#ifndef CONFIGURE_MESSAGE_BUFFER_MEMORY
2071  #define CONFIGURE_MESSAGE_BUFFER_MEMORY 0
2072#endif
2073
2074/**
2075 * This macro is available just in case the confdefs.h file underallocates
2076 * memory for a particular application.  This lets the user add some extra
2077 * memory in case something broken and underestimates.
2078 *
2079 * It is also possible for cases where confdefs.h overallocates memory,
2080 * you could substract memory from the allocated.  The estimate is just
2081 * that, an estimate, and assumes worst case alignment and padding on
2082 * each allocated element.  So in some cases it could be too conservative.
2083 *
2084 * NOTE: Historically this was used for message buffers.
2085 */
2086#ifndef CONFIGURE_MEMORY_OVERHEAD
2087  #define CONFIGURE_MEMORY_OVERHEAD 0
2088#endif
2089
2090/**
2091 * On architectures that use Simple Vectored Interrupts, it is RTEMS
2092 * responsibility to allocate the vector table.  This avoids reserving
2093 * the memory on architectures that use the Programmable Interrupt
2094 * Controller Vectored Interrupts.
2095 */
2096#if (CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE)
2097  /*
2098   *  This is a (hopefully) temporary hack.  On the mips, the number of
2099   *  vectors is NOT statically defined.  But it has to be statically
2100   *  defined for this to work.  This is an issue looking for a nice
2101   *  solution.
2102   */
2103  #if defined(__mips__)
2104    #define CONFIGURE_INTERRUPT_VECTOR_TABLE \
2105      _Configure_From_workspace( (sizeof(ISR_Handler_entry) * 256))
2106  #else
2107    #define CONFIGURE_INTERRUPT_VECTOR_TABLE \
2108      _Configure_From_workspace( \
2109        (sizeof(ISR_Handler_entry) * ISR_NUMBER_OF_VECTORS))
2110  #endif
2111#else
2112  #define CONFIGURE_INTERRUPT_VECTOR_TABLE 0
2113#endif
2114
2115/**
2116 * RTEMS uses two instance of an internal mutex class.  This accounts
2117 * for these mutexes.
2118 */
2119#define CONFIGURE_API_MUTEX_MEMORY \
2120  _Configure_Object_RAM(2, sizeof(API_Mutex_Control))
2121
2122/**
2123 * This calculates the amount of memory reserved for the IDLE tasks.
2124 * In an SMP system, each CPU core has its own idle task.
2125 */
2126#if defined(RTEMS_SMP)
2127  #define CONFIGURE_IDLE_TASKS_COUNT CONFIGURE_SMP_MAXIMUM_PROCESSORS
2128#else
2129  #define CONFIGURE_IDLE_TASKS_COUNT 1
2130#endif
2131
2132/**
2133 * This defines the formula used to compute the amount of memory
2134 * reserved for IDLE task control structures.
2135 */
2136#define CONFIGURE_MEMORY_FOR_IDLE_TASK \
2137  CONFIGURE_MEMORY_FOR_TASKS(CONFIGURE_IDLE_TASKS_COUNT, 0)
2138
2139/**
2140 * This macro accounts for general RTEMS system overhead.
2141 */
2142#define CONFIGURE_MEMORY_FOR_SYSTEM_OVERHEAD \
2143  ( CONFIGURE_MEMORY_FOR_IDLE_TASK +                /* IDLE and stack */ \
2144    CONFIGURE_INTERRUPT_VECTOR_TABLE +             /* interrupt vectors */ \
2145    CONFIGURE_INTERRUPT_STACK_MEMORY +             /* interrupt stack */ \
2146    CONFIGURE_API_MUTEX_MEMORY                     /* allocation mutex */ \
2147  )
2148
2149/**
2150 * This macro reserves the memory required by the statically configured
2151 * user extensions.
2152 */
2153#define CONFIGURE_MEMORY_FOR_STATIC_EXTENSIONS \
2154  (CONFIGURE_NUMBER_OF_INITIAL_EXTENSIONS == 0 ? 0 : \
2155    _Configure_From_workspace( \
2156      CONFIGURE_NUMBER_OF_INITIAL_EXTENSIONS \
2157        * sizeof(User_extensions_Switch_control) \
2158    ))
2159
2160/**
2161 * This macro provides a summation of the memory required by the
2162 * Classic API as configured.
2163 */
2164#define CONFIGURE_MEMORY_FOR_CLASSIC \
2165  (CONFIGURE_MEMORY_FOR_TASK_VARIABLES(CONFIGURE_MAXIMUM_TASK_VARIABLES + \
2166    CONFIGURE_GOROUTINES_TASK_VARIABLES) + \
2167   CONFIGURE_MEMORY_FOR_TIMERS(CONFIGURE_MAXIMUM_TIMERS + \
2168    CONFIGURE_TIMER_FOR_SHARED_MEMORY_DRIVER ) + \
2169   CONFIGURE_MEMORY_FOR_SEMAPHORES(CONFIGURE_SEMAPHORES) + \
2170   CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(CONFIGURE_MAXIMUM_MESSAGE_QUEUES) + \
2171   CONFIGURE_MEMORY_FOR_PARTITIONS(CONFIGURE_MAXIMUM_PARTITIONS) + \
2172   CONFIGURE_MEMORY_FOR_REGIONS( CONFIGURE_MAXIMUM_REGIONS ) + \
2173   CONFIGURE_MEMORY_FOR_PORTS(CONFIGURE_MAXIMUM_PORTS) + \
2174   CONFIGURE_MEMORY_FOR_PERIODS(CONFIGURE_MAXIMUM_PERIODS) + \
2175   CONFIGURE_MEMORY_FOR_BARRIERS(CONFIGURE_BARRIERS) + \
2176   CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(CONFIGURE_MAXIMUM_USER_EXTENSIONS) \
2177  )
2178
2179#if defined(RTEMS_SMP)
2180  #define CONFIGURE_MEMORY_FOR_SMP \
2181     (CONFIGURE_SMP_MAXIMUM_PROCESSORS * \
2182      _Configure_From_workspace( CONFIGURE_INTERRUPT_STACK_SIZE ) \
2183     )
2184#else
2185  #define CONFIGURE_MEMORY_FOR_SMP 0
2186#endif
2187
2188/**
2189 * This calculates the memory required for the executive workspace.
2190 */
2191#define CONFIGURE_EXECUTIVE_RAM_SIZE \
2192(( \
2193   CONFIGURE_MEMORY_FOR_SYSTEM_OVERHEAD + \
2194   CONFIGURE_MEMORY_FOR_TASKS( \
2195     CONFIGURE_TASKS, CONFIGURE_TASKS) + \
2196   CONFIGURE_MEMORY_FOR_TASKS( \
2197     CONFIGURE_POSIX_THREADS, CONFIGURE_POSIX_THREADS) + \
2198   CONFIGURE_MEMORY_FOR_CLASSIC + \
2199   CONFIGURE_MEMORY_FOR_POSIX_KEYS( \
2200      CONFIGURE_POSIX_KEYS, \
2201      CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS ) + \
2202   CONFIGURE_MEMORY_FOR_POSIX + \
2203   CONFIGURE_MEMORY_FOR_STATIC_EXTENSIONS + \
2204   CONFIGURE_MEMORY_FOR_MP + \
2205   CONFIGURE_MEMORY_FOR_SMP + \
2206   CONFIGURE_MESSAGE_BUFFER_MEMORY + \
2207   (CONFIGURE_MEMORY_OVERHEAD * 1024) \
2208) & ~0x7)
2209
2210/*
2211 *  Now account for any extra memory that initialization tasks or threads
2212 *  may have requested.
2213 */
2214
2215/**
2216 * This accounts for any extra memory required by the Classic API
2217 * Initialization Task.
2218 */
2219#if (CONFIGURE_INIT_TASK_STACK_SIZE > CONFIGURE_MINIMUM_TASK_STACK_SIZE)
2220  #define CONFIGURE_INITIALIZATION_THREADS_STACKS_CLASSIC_PART \
2221      (CONFIGURE_INIT_TASK_STACK_SIZE - CONFIGURE_MINIMUM_TASK_STACK_SIZE)
2222#else
2223  #define CONFIGURE_INITIALIZATION_THREADS_STACKS_CLASSIC_PART 0
2224#endif
2225
2226/**
2227 * This accounts for any extra memory required by the POSIX API
2228 * Initialization Thread.
2229 */
2230#if defined(RTEMS_POSIX_API) && \
2231    (CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE > \
2232      CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE)
2233  #define CONFIGURE_INITIALIZATION_THREADS_STACKS_POSIX_PART \
2234    (CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE - \
2235      CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE)
2236#else
2237  #define CONFIGURE_INITIALIZATION_THREADS_STACKS_POSIX_PART 0
2238#endif
2239
2240/**
2241 * This macro provides a summation of the various initialization task
2242 * and thread stack requirements.
2243 */
2244#define CONFIGURE_INITIALIZATION_THREADS_EXTRA_STACKS \
2245    (CONFIGURE_INITIALIZATION_THREADS_STACKS_CLASSIC_PART + \
2246    CONFIGURE_INITIALIZATION_THREADS_STACKS_POSIX_PART)
2247
2248#define CONFIGURE_IDLE_TASKS_STACK \
2249  (CONFIGURE_IDLE_TASKS_COUNT * \
2250    _Configure_From_stackspace( CONFIGURE_IDLE_TASK_STACK_SIZE ) )
2251
2252#define CONFIGURE_TASKS_STACK \
2253  (_Configure_Max_Objects( CONFIGURE_TASKS ) * \
2254    _Configure_From_stackspace( CONFIGURE_MINIMUM_TASK_STACK_SIZE ) )
2255
2256#define CONFIGURE_POSIX_THREADS_STACK \
2257  (_Configure_Max_Objects( CONFIGURE_MAXIMUM_POSIX_THREADS ) * \
2258    _Configure_From_stackspace( CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE ) )
2259
2260#define CONFIGURE_GOROUTINES_STACK \
2261  (_Configure_Max_Objects( CONFIGURE_MAXIMUM_GOROUTINES ) * \
2262    _Configure_From_stackspace( CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE ) )
2263
2264#define CONFIGURE_ADA_TASKS_STACK \
2265  (_Configure_Max_Objects( CONFIGURE_MAXIMUM_ADA_TASKS ) * \
2266    _Configure_From_stackspace( CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE ) )
2267
2268#else /* CONFIGURE_EXECUTIVE_RAM_SIZE */
2269
2270#define CONFIGURE_IDLE_TASKS_STACK 0
2271#define CONFIGURE_INITIALIZATION_THREADS_EXTRA_STACKS 0
2272#define CONFIGURE_TASKS_STACK 0
2273#define CONFIGURE_POSIX_THREADS_STACK 0
2274#define CONFIGURE_GOROUTINES_STACK 0
2275#define CONFIGURE_ADA_TASKS_STACK 0
2276
2277#if CONFIGURE_EXTRA_MPCI_RECEIVE_SERVER_STACK != 0
2278  #error "CONFIGURE_EXECUTIVE_RAM_SIZE defined with request for CONFIGURE_EXTRA_MPCI_RECEIVE_SERVER_STACK"
2279#endif
2280
2281#if CONFIGURE_EXTRA_TASK_STACKS != 0
2282  #error "CONFIGURE_EXECUTIVE_RAM_SIZE defined with request for CONFIGURE_EXTRA_TASK_STACKS"
2283#endif
2284
2285#endif /* CONFIGURE_EXECUTIVE_RAM_SIZE */
2286
2287#define CONFIGURE_STACK_SPACE_SIZE \
2288  ( \
2289    CONFIGURE_IDLE_TASKS_STACK + \
2290    CONFIGURE_INITIALIZATION_THREADS_EXTRA_STACKS + \
2291    CONFIGURE_TASKS_STACK + \
2292    CONFIGURE_POSIX_THREADS_STACK + \
2293    CONFIGURE_GOROUTINES_STACK + \
2294    CONFIGURE_ADA_TASKS_STACK + \
2295    CONFIGURE_EXTRA_MPCI_RECEIVE_SERVER_STACK + \
2296    CONFIGURE_LIBBLOCK_TASK_EXTRA_STACKS + \
2297    CONFIGURE_EXTRA_TASK_STACKS \
2298  )
2299
2300#ifdef CONFIGURE_INIT
2301  typedef struct {
2302    Thread_Control Control;
2303    #if CONFIGURE_MAXIMUM_USER_EXTENSIONS > 0
2304      void *extensions[ CONFIGURE_MAXIMUM_USER_EXTENSIONS + 1 ];
2305    #endif
2306    union {
2307      #ifdef CONFIGURE_SCHEDULER_CBS
2308        Scheduler_CBS_Per_thread CBS;
2309      #endif
2310      #ifdef CONFIGURE_SCHEDULER_EDF
2311        Scheduler_EDF_Per_thread EDF;
2312      #endif
2313      #if defined(CONFIGURE_SCHEDULER_PRIORITY) \
2314        || defined(CONFIGURE_SCHEDULER_PRIORITY_SMP)
2315        Scheduler_priority_Per_thread Priority;
2316      #endif
2317      #ifdef CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP
2318        Scheduler_priority_affinity_SMP_Per_thread Priority_affinity;
2319      #endif
2320      #ifdef CONFIGURE_SCHEDULER_USER_PER_THREAD
2321        CONFIGURE_SCHEDULER_USER_PER_THREAD User;
2322      #endif
2323    } Scheduler;
2324    RTEMS_API_Control API_RTEMS;
2325    #ifndef CONFIGURE_DISABLE_CLASSIC_API_NOTEPADS
2326      uint32_t Notepads[ RTEMS_NUMBER_NOTEPADS ];
2327    #endif
2328    #ifdef RTEMS_POSIX_API
2329      POSIX_API_Control API_POSIX;
2330    #endif
2331    #if !defined(RTEMS_SCHEDSIM) \
2332      && defined(RTEMS_NEWLIB) \
2333      && !defined(CONFIGURE_DISABLE_NEWLIB_REENTRANCY)
2334      struct _reent Newlib;
2335    #else
2336      struct { /* Empty */ } Newlib;
2337    #endif
2338  } Configuration_Thread_control;
2339
2340  const size_t _Thread_Control_size = sizeof( Configuration_Thread_control );
2341
2342  const Thread_Control_add_on _Thread_Control_add_ons[] = {
2343    {
2344      offsetof( Configuration_Thread_control, Control.scheduler_info ),
2345      offsetof( Configuration_Thread_control, Scheduler )
2346    }, {
2347      offsetof(
2348        Configuration_Thread_control,
2349        Control.API_Extensions[ THREAD_API_RTEMS ]
2350      ),
2351      offsetof( Configuration_Thread_control, API_RTEMS )
2352    }, {
2353      offsetof(
2354        Configuration_Thread_control,
2355        Control.libc_reent
2356      ),
2357      offsetof( Configuration_Thread_control, Newlib )
2358    }
2359    #ifdef RTEMS_POSIX_API
2360      , {
2361        offsetof(
2362          Configuration_Thread_control,
2363          Control.API_Extensions[ THREAD_API_POSIX ]
2364        ),
2365        offsetof( Configuration_Thread_control, API_POSIX )
2366      }
2367    #endif
2368  };
2369
2370  const size_t _Thread_Control_add_on_count =
2371    RTEMS_ARRAY_SIZE( _Thread_Control_add_ons );
2372
2373  /**
2374   * This is the Classic API Configuration Table.
2375   */
2376  rtems_api_configuration_table Configuration_RTEMS_API = {
2377    CONFIGURE_TASKS,
2378    CONFIGURE_NOTEPADS_ENABLED,
2379    CONFIGURE_MAXIMUM_TIMERS + CONFIGURE_TIMER_FOR_SHARED_MEMORY_DRIVER,
2380    CONFIGURE_SEMAPHORES,
2381    CONFIGURE_MAXIMUM_MESSAGE_QUEUES,
2382    CONFIGURE_MAXIMUM_PARTITIONS,
2383    CONFIGURE_MAXIMUM_REGIONS,
2384    CONFIGURE_MAXIMUM_PORTS,
2385    CONFIGURE_MAXIMUM_PERIODS,
2386    CONFIGURE_BARRIERS,
2387    CONFIGURE_INIT_TASK_TABLE_SIZE,
2388    CONFIGURE_INIT_TASK_TABLE
2389  };
2390
2391  #ifdef RTEMS_POSIX_API
2392    /**
2393     * This is the POSIX API Configuration Table.
2394     */
2395    posix_api_configuration_table Configuration_POSIX_API = {
2396      CONFIGURE_POSIX_THREADS,
2397      CONFIGURE_MAXIMUM_POSIX_MUTEXES + CONFIGURE_GNAT_MUTEXES +
2398        CONFIGURE_MAXIMUM_ADA_TASKS + CONFIGURE_MAXIMUM_FAKE_ADA_TASKS +
2399        CONFIGURE_GO_INIT_MUTEXES + CONFIGURE_MAXIMUM_GO_CHANNELS,
2400      CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES +
2401        CONFIGURE_MAXIMUM_ADA_TASKS + CONFIGURE_MAXIMUM_FAKE_ADA_TASKS +
2402        CONFIGURE_GO_INIT_CONDITION_VARIABLES + CONFIGURE_MAXIMUM_GO_CHANNELS,
2403      CONFIGURE_MAXIMUM_POSIX_TIMERS,
2404      CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS,
2405      CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES,
2406      CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS,
2407      CONFIGURE_MAXIMUM_POSIX_SEMAPHORES,
2408      CONFIGURE_MAXIMUM_POSIX_BARRIERS,
2409      CONFIGURE_MAXIMUM_POSIX_RWLOCKS,
2410      CONFIGURE_MAXIMUM_POSIX_SPINLOCKS,
2411      CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE,
2412      CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME
2413    };
2414  #endif
2415
2416  /**
2417   * This variable specifies the minimum stack size for tasks in an RTEMS
2418   * application.
2419   *
2420   * NOTE: This is left as a simple uint32_t so it can be externed as
2421   *       needed without requring being high enough logical to
2422   *       include the full configuration table.
2423   */
2424  uint32_t rtems_minimum_stack_size =
2425    CONFIGURE_MINIMUM_TASK_STACK_SIZE;
2426
2427  /**
2428   * This variable specifies the maximum priority value that
2429   * a task may have.  This must be a power of 2 between 4
2430   * and 256 and is specified in terms of Classic API
2431   * priority values.
2432   *
2433   * NOTE: This is left as a simple uint8_t so it can be externed as
2434   *       needed without requring being high enough logical to
2435   *       include the full configuration table.
2436   */
2437  uint8_t rtems_maximum_priority = CONFIGURE_MAXIMUM_PRIORITY;
2438
2439  /**
2440   * This is the primary Configuration Table for this application.
2441   */
2442  const rtems_configuration_table Configuration = {
2443    CONFIGURE_EXECUTIVE_RAM_SIZE,             /* required RTEMS workspace */
2444    CONFIGURE_STACK_SPACE_SIZE,               /* required stack space */
2445    CONFIGURE_MAXIMUM_USER_EXTENSIONS,        /* maximum dynamic extensions */
2446    CONFIGURE_POSIX_KEYS,                     /* POSIX keys are always */
2447    CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS,  /*   enabled */
2448    CONFIGURE_MICROSECONDS_PER_TICK,          /* microseconds per clock tick */
2449    1000 * CONFIGURE_MICROSECONDS_PER_TICK,   /* nanoseconds per clock tick */
2450    CONFIGURE_TICKS_PER_TIMESLICE,            /* ticks per timeslice quantum */
2451    CONFIGURE_IDLE_TASK_BODY,                 /* user's IDLE task */
2452    CONFIGURE_IDLE_TASK_STACK_SIZE,           /* IDLE task stack size */
2453    CONFIGURE_INTERRUPT_STACK_SIZE,           /* interrupt stack size */
2454    CONFIGURE_TASK_STACK_ALLOCATOR_INIT,      /* stack allocator init */
2455    CONFIGURE_TASK_STACK_ALLOCATOR,           /* stack allocator */
2456    CONFIGURE_TASK_STACK_DEALLOCATOR,         /* stack deallocator */
2457    CONFIGURE_ZERO_WORKSPACE_AUTOMATICALLY,   /* true to clear memory */
2458    #ifdef CONFIGURE_UNIFIED_WORK_AREAS       /* true for unified work areas */
2459      true,
2460    #else
2461      false,
2462    #endif
2463    #ifdef CONFIGURE_TASK_STACK_ALLOCATOR_AVOIDS_WORK_SPACE /* true to avoid
2464                                                 work space for thread stack
2465                                                 allocation */
2466      true,
2467    #else
2468      false,
2469    #endif
2470    #ifdef RTEMS_SMP
2471      #ifdef CONFIGURE_SMP_APPLICATION
2472        true,
2473      #else
2474        false,
2475      #endif
2476    #endif
2477    CONFIGURE_NUMBER_OF_INITIAL_EXTENSIONS,   /* number of static extensions */
2478    CONFIGURE_INITIAL_EXTENSION_TABLE,        /* pointer to static extensions */
2479    #if defined(RTEMS_MULTIPROCESSING)
2480      CONFIGURE_MULTIPROCESSING_TABLE,        /* pointer to MP config table */
2481    #endif
2482    #ifdef RTEMS_SMP
2483      CONFIGURE_SMP_MAXIMUM_PROCESSORS,
2484    #endif
2485  };
2486#endif
2487
2488#endif /* CONFIGURE_HAS_OWN_CONFIGURATION_TABLE */
2489
2490#if defined(RTEMS_SMP)
2491 /*
2492  * Instantiate the Per CPU information based upon the user configuration.
2493  */
2494 #if defined(CONFIGURE_INIT)
2495   Per_CPU_Control_envelope _Per_CPU_Information[CONFIGURE_SMP_MAXIMUM_PROCESSORS];
2496 #endif
2497
2498#endif
2499
2500/*
2501 *  If the user has configured a set of Classic API Initialization Tasks,
2502 *  then we need to install the code that runs that loop.
2503 */
2504#ifdef CONFIGURE_INIT
2505  #if defined(CONFIGURE_RTEMS_INIT_TASKS_TABLE) || \
2506      defined(CONFIGURE_HAS_OWN_INIT_TASK_TABLE)
2507    void (*_RTEMS_tasks_Initialize_user_tasks_p)(void) =
2508              _RTEMS_tasks_Initialize_user_tasks_body;
2509  #else
2510    void (*_RTEMS_tasks_Initialize_user_tasks_p)(void) = NULL;
2511  #endif
2512#endif
2513
2514/*
2515 *  If the user has configured a set of POSIX Initialization Threads,
2516 *  then we need to install the code that runs that loop.
2517 */
2518#ifdef RTEMS_POSIX_API
2519  #ifdef CONFIGURE_INIT
2520    #if defined(CONFIGURE_POSIX_INIT_THREAD_TABLE) || \
2521        defined(CONFIGURE_POSIX_HAS_OWN_INIT_THREAD_TABLE)
2522      void (*_POSIX_Threads_Initialize_user_threads_p)(void) =
2523                _POSIX_Threads_Initialize_user_threads_body;
2524    #else
2525      void (*_POSIX_Threads_Initialize_user_threads_p)(void) = NULL;
2526    #endif
2527  #endif
2528#endif
2529
2530#ifdef __cplusplus
2531}
2532#endif
2533
2534/******************************************************************
2535 ******************************************************************
2536 ******************************************************************
2537 *         CONFIGURATION WARNINGS AND ERROR CHECKING              *
2538 ******************************************************************
2539 ******************************************************************
2540 ******************************************************************
2541 */
2542
2543#if defined(CONFIGURE_CONFDEFS_DEBUG) && defined(CONFIGURE_INIT)
2544  /**
2545   * This is a debug mechanism, so if you need to, the executable will
2546   * have a structure with various partial values.  Add to this as you
2547   * need to.  Viewing this structure in gdb combined with dumping
2548   * the Configuration structures generated should help a lot in tracing
2549   * down errors and analyzing where over and under allocations are.
2550   */
2551  typedef struct {
2552    uint32_t SYSTEM_OVERHEAD;
2553    uint32_t STATIC_EXTENSIONS;
2554    uint32_t INITIALIZATION_THREADS_STACKS;
2555
2556    uint32_t PER_INTEGER_TASK;
2557    uint32_t FP_OVERHEAD;
2558    uint32_t CLASSIC;
2559    uint32_t POSIX;
2560
2561    /* System overhead pieces */
2562    uint32_t INTERRUPT_VECTOR_TABLE;
2563    uint32_t INTERRUPT_STACK_MEMORY;
2564    uint32_t MEMORY_FOR_IDLE_TASK;
2565
2566    /* Classic API Pieces */
2567    uint32_t CLASSIC_TASKS;
2568    uint32_t TASK_VARIABLES;
2569    uint32_t TIMERS;
2570    uint32_t SEMAPHORES;
2571    uint32_t MESSAGE_QUEUES;
2572    uint32_t PARTITIONS;
2573    uint32_t REGIONS;
2574    uint32_t PORTS;
2575    uint32_t PERIODS;
2576    uint32_t BARRIERS;
2577    uint32_t USER_EXTENSIONS;
2578
2579    /* POSIX API managers that are always enabled */
2580    uint32_t POSIX_KEYS;
2581
2582#ifdef RTEMS_POSIX_API
2583    /* POSIX API Pieces */
2584    uint32_t POSIX_MUTEXES;
2585    uint32_t POSIX_CONDITION_VARIABLES;
2586    uint32_t POSIX_TIMERS;
2587    uint32_t POSIX_QUEUED_SIGNALS;
2588    uint32_t POSIX_MESSAGE_QUEUES;
2589    uint32_t POSIX_SEMAPHORES;
2590    uint32_t POSIX_BARRIERS;
2591    uint32_t POSIX_SPINLOCKS;
2592    uint32_t POSIX_RWLOCKS;
2593#endif
2594
2595    /* Stack space sizes */
2596    uint32_t IDLE_TASKS_STACK;
2597    uint32_t INITIALIZATION_THREADS_EXTRA_STACKS;
2598    uint32_t TASKS_STACK;
2599    uint32_t POSIX_THREADS_STACK;
2600    uint32_t GOROUTINES_STACK;
2601    uint32_t ADA_TASKS_STACK;
2602    uint32_t EXTRA_MPCI_RECEIVE_SERVER_STACK;
2603    uint32_t EXTRA_TASK_STACKS;
2604  } Configuration_Debug_t;
2605
2606  Configuration_Debug_t Configuration_Memory_Debug = {
2607    /* General Information */
2608    CONFIGURE_MEMORY_FOR_SYSTEM_OVERHEAD,
2609    CONFIGURE_MEMORY_FOR_STATIC_EXTENSIONS,
2610    CONFIGURE_INITIALIZATION_THREADS_EXTRA_STACKS,
2611    CONFIGURE_MEMORY_FOR_TASKS(1, 0),
2612    CONFIGURE_MEMORY_FOR_TASKS(0, 1),
2613    CONFIGURE_MEMORY_FOR_CLASSIC,
2614    CONFIGURE_MEMORY_FOR_POSIX,
2615
2616    /* System overhead pieces */
2617    CONFIGURE_INTERRUPT_VECTOR_TABLE,
2618    CONFIGURE_INTERRUPT_STACK_MEMORY,
2619    CONFIGURE_MEMORY_FOR_IDLE_TASK,
2620
2621    /* Classic API Pieces */
2622    CONFIGURE_MEMORY_FOR_TASKS(CONFIGURE_MAXIMUM_TASKS, 0),
2623    CONFIGURE_MEMORY_FOR_TASK_VARIABLES(CONFIGURE_MAXIMUM_TASK_VARIABLES +
2624      CONFIGURE_GOROUTINES_TASK_VARIABLES),
2625    CONFIGURE_MEMORY_FOR_TIMERS(CONFIGURE_MAXIMUM_TIMERS),
2626    CONFIGURE_MEMORY_FOR_SEMAPHORES(CONFIGURE_SEMAPHORES),
2627    CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(CONFIGURE_MAXIMUM_MESSAGE_QUEUES),
2628    CONFIGURE_MEMORY_FOR_PARTITIONS(CONFIGURE_MAXIMUM_PARTITIONS),
2629    CONFIGURE_MEMORY_FOR_REGIONS( CONFIGURE_MAXIMUM_REGIONS ),
2630    CONFIGURE_MEMORY_FOR_PORTS(CONFIGURE_MAXIMUM_PORTS),
2631    CONFIGURE_MEMORY_FOR_PERIODS(CONFIGURE_MAXIMUM_PERIODS),
2632    CONFIGURE_MEMORY_FOR_BARRIERS(CONFIGURE_BARRIERS),
2633    CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(CONFIGURE_MAXIMUM_USER_EXTENSIONS),
2634    CONFIGURE_MEMORY_FOR_POSIX_KEYS( CONFIGURE_POSIX_KEYS, \
2635                                     CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS ),
2636
2637#ifdef RTEMS_POSIX_API
2638    /* POSIX API Pieces */
2639    CONFIGURE_MEMORY_FOR_POSIX_MUTEXES( CONFIGURE_MAXIMUM_POSIX_MUTEXES +
2640      CONFIGURE_MAXIMUM_GO_CHANNELS + CONFIGURE_GO_INIT_MUTEXES),
2641    CONFIGURE_MEMORY_FOR_POSIX_CONDITION_VARIABLES(
2642      CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES +
2643      CONFIGURE_MAXIMUM_GO_CHANNELS + CONFIGURE_GO_INIT_CONDITION_VARIABLES),
2644    CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS(
2645      CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS ),
2646    CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES(
2647      CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES ),
2648    CONFIGURE_MEMORY_FOR_POSIX_SEMAPHORES( CONFIGURE_MAXIMUM_POSIX_SEMAPHORES ),
2649    CONFIGURE_MEMORY_FOR_POSIX_BARRIERS( CONFIGURE_MAXIMUM_POSIX_BARRIERS ),
2650    CONFIGURE_MEMORY_FOR_POSIX_SPINLOCKS( CONFIGURE_MAXIMUM_POSIX_SPINLOCKS ),
2651    CONFIGURE_MEMORY_FOR_POSIX_RWLOCKS( CONFIGURE_MAXIMUM_POSIX_RWLOCKS ),
2652    CONFIGURE_MEMORY_FOR_POSIX_TIMERS( CONFIGURE_MAXIMUM_POSIX_TIMERS ),
2653#endif
2654
2655    /* Stack space sizes */
2656    CONFIGURE_IDLE_TASKS_STACK,
2657    CONFIGURE_INITIALIZATION_THREADS_EXTRA_STACKS,
2658    CONFIGURE_TASKS_STACK,
2659    CONFIGURE_POSIX_THREADS_STACK,
2660    CONFIGURE_GOROUTINES_STACK,
2661    CONFIGURE_ADA_TASKS_STACK,
2662    CONFIGURE_EXTRA_MPCI_RECEIVE_SERVER_STACK,
2663    CONFIGURE_EXTRA_TASK_STACKS
2664  };
2665#endif
2666
2667/*
2668 *  Make sure a task/thread of some sort is configured.
2669 *
2670 *  When analyzing RTEMS to find the smallest possible of memory
2671 *  that must be allocated, you probably do want to configure 0
2672 *  tasks/threads so there is a smaller set of calls to _Workspace_Allocate
2673 *  to analyze.
2674 */
2675#if !defined(CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION)
2676  #if (CONFIGURE_MAXIMUM_TASKS == 0) && \
2677      (CONFIGURE_MAXIMUM_POSIX_THREADS == 0) && \
2678      (CONFIGURE_MAXIMUM_ADA_TASKS == 0) && \
2679      (CONFIGURE_MAXIMUM_GOROUTINES == 0)
2680    #error "CONFIGURATION ERROR: No tasks or threads configured!!"
2681  #endif
2682#endif
2683
2684#ifndef RTEMS_SCHEDSIM
2685/*
2686 *  Make sure at least one of the initialization task/thread
2687 *  tables was defined.
2688 */
2689#if !defined(CONFIGURE_RTEMS_INIT_TASKS_TABLE) && \
2690    !defined(CONFIGURE_POSIX_INIT_THREAD_TABLE) && \
2691    !defined(CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION)
2692#error "CONFIGURATION ERROR: No initialization tasks or threads configured!!"
2693#endif
2694#endif
2695
2696/*
2697 *  If the user is trying to configure a multiprocessing application and
2698 *  RTEMS was not configured and built multiprocessing, then error out.
2699 */
2700#if defined(CONFIGURE_MP_APPLICATION) && \
2701    !defined(RTEMS_MULTIPROCESSING)
2702#error "CONFIGURATION ERROR: RTEMS not configured for multiprocessing!!"
2703#endif
2704
2705/*
2706 *  If an attempt was made to configure POSIX objects and
2707 *  the POSIX API was not configured into RTEMS, error out.
2708 *
2709 *  @note POSIX Keys are always available so the parameters
2710 *        CONFIGURE_MAXIMUM_POSIX_KEYS and
2711 *        CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS  are not in this list.
2712 */
2713#if !defined(RTEMS_POSIX_API)
2714  #if ((CONFIGURE_MAXIMUM_POSIX_THREADS != 0) || \
2715       (CONFIGURE_MAXIMUM_POSIX_MUTEXES != 0) || \
2716       (CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES != 0) || \
2717       (CONFIGURE_MAXIMUM_POSIX_TIMERS != 0) || \
2718       (CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS != 0) || \
2719       (CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES != 0) || \
2720       (CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS != 0) || \
2721       (CONFIGURE_MAXIMUM_POSIX_SEMAPHORES != 0) || \
2722       (CONFIGURE_MAXIMUM_POSIX_BARRIERS != 0) || \
2723       (CONFIGURE_MAXIMUM_POSIX_SPINLOCKS != 0) || \
2724       (CONFIGURE_MAXIMUM_POSIX_RWLOCKS != 0) || \
2725      defined(CONFIGURE_POSIX_INIT_THREAD_TABLE))
2726  #error "CONFIGURATION ERROR: POSIX API support not configured!!"
2727  #endif
2728#endif
2729
2730#if !defined(RTEMS_SCHEDSIM)
2731  #if !defined(CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE)
2732    /*
2733     *  You must either explicity include or exclude the clock driver.
2734     *  It is such a common newbie error to leave it out.  Maybe this
2735     *  will put an end to it.
2736     *
2737     *  NOTE: If you are using the timer driver, it is considered
2738     *        mutually exclusive with the clock driver because the
2739     *        drivers are assumed to use the same "timer" hardware
2740     *        on many boards.
2741     */
2742    #if !defined(CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER) && \
2743        !defined(CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER) && \
2744        !defined(CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER)
2745      #error "CONFIGURATION ERROR: Do you want the clock driver or not?!?"
2746     #endif
2747
2748    /*
2749     * Only one of the following three configuration parameters should be
2750     * defined at a time.
2751     */
2752    #if ((defined(CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER) + \
2753          defined(CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER) + \
2754          defined(CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER)) > 1)
2755       #error "CONFIGURATION ERROR: More than one clock/timer driver configuration parameter specified?!?"
2756    #endif
2757  #endif /* !defined(CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE) */
2758#endif   /* !defined(RTEMS_SCHEDSIM) */
2759
2760/*
2761 *  These names have been obsoleted so make the user application stop compiling
2762 */
2763#if defined(CONFIGURE_TEST_NEEDS_TIMER_DRIVER) || \
2764    defined(CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER) || \
2765    defined(CONFIGURE_TEST_NEEDS_CLOCK_DRIVER) || \
2766    defined(CONFIGURE_TEST_NEEDS_RTC_DRIVER) || \
2767    defined(CONFIGURE_TEST_NEEDS_STUB_DRIVER)
2768#error "CONFIGURATION ERROR: CONFIGURE_TEST_XXX constants are obsolete"
2769#endif
2770
2771/*
2772 *  Validate the configured maximum priority
2773 */
2774#if ((CONFIGURE_MAXIMUM_PRIORITY != 3) && \
2775     (CONFIGURE_MAXIMUM_PRIORITY != 7) && \
2776     (CONFIGURE_MAXIMUM_PRIORITY != 15) && \
2777     (CONFIGURE_MAXIMUM_PRIORITY != 31) && \
2778     (CONFIGURE_MAXIMUM_PRIORITY != 63) && \
2779     (CONFIGURE_MAXIMUM_PRIORITY != 127) && \
2780     (CONFIGURE_MAXIMUM_PRIORITY != 255))
2781  #error "Maximum priority is not 1 less than a power of 2 between 4 and 256"
2782#endif
2783
2784#if (CONFIGURE_MAXIMUM_PRIORITY > PRIORITY_DEFAULT_MAXIMUM)
2785  #error "Maximum priority configured higher than supported by target."
2786#endif
2787
2788/*
2789 *  If you have fewer POSIX Message Queue Descriptors than actual
2790 *  POSIX Message Queues, then you will not be able to open all the
2791 *  queues.
2792 */
2793#if (CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS < \
2794     CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES)
2795  #error "Fewer POSIX Message Queue descriptors than Queues!"
2796#endif
2797
2798/*
2799 * POSIX Key pair shouldn't be less than POSIX Key, which is highly
2800 * likely to be error.
2801 */
2802#if (CONFIGURE_MAXIMUM_POSIX_KEYS != 0) && \
2803    (CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS != 0)
2804  #if (CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS < CONFIGURE_MAXIMUM_POSIX_KEYS)
2805    #error "Fewer POSIX Key pairs than POSIX Key!"
2806  #endif
2807#endif
2808
2809#endif
2810/* end of include file */
Note: See TracBrowser for help on using the repository browser.