source: rtems-docs/cpu-supplement/port.rst @ ec95748

5
Last change on this file since ec95748 was e52906b, checked in by Sebastian Huber <sebastian.huber@…>, on 01/09/19 at 15:14:06

Simplify SPDX-License-Identifier comment

  • Property mode set to 100644
File size: 19.5 KB
Line 
1.. SPDX-License-Identifier: CC-BY-SA-4.0
2
3.. Copyright (C) 1988, 2002 On-Line Applications Research Corporation (OAR)
4
5Port Specific Information
6*************************
7
8This chaper provides a general description of the type of architecture specific
9information which is in each of the architecture specific chapters that follow.
10The outline of this chapter is identical to that of the architecture specific
11chapters.
12
13In each of the architecture specific chapters, this introductory section will
14provide an overview of the architecture:
15
16**Architecture Documents**
17
18In each of the architecture specific chapters, this section will provide
19pointers on where to obtain documentation.
20
21CPU Model Dependent Features
22============================
23
24Microprocessors are generally classified into families with a variety of CPU
25models or implementations within that family.  Within a processor family, there
26is a high level of binary compatibility.  This family may be based on either an
27architectural specification or on maintaining compatibility with a popular
28processor.  Recent microprocessor families such as the SPARC or PowerPC are
29based on an architectural specification which is independent or any particular
30CPU model or implementation.  Older families such as the Motorola 68000 and the
31Intel x86 evolved as the manufacturer strived to produce higher performance
32processor models which maintained binary compatibility with older models.
33
34RTEMS takes advantage of the similarity of the various models within a CPU
35family.  Although the models do vary in significant ways, the high level of
36compatibility makes it possible to share the bulk of the CPU dependent
37executive code across the entire family.  Each processor family supported by
38RTEMS has a list of features which vary between CPU models within a family.
39For example, the most common model dependent feature regardless of CPU family
40is the presence or absence of a floating point unit or coprocessor.  When
41defining the list of features present on a particular CPU model, one simply
42notes that floating point hardware is or is not present and defines a single
43constant appropriately.  Conditional compilation is utilized to include the
44appropriate source code for this CPU model's feature set.  It is important to
45note that this means that RTEMS is thus compiled using the appropriate feature
46set and compilation flags optimal for this CPU model used.  The alternative
47would be to generate a binary which would execute on all family members using
48only the features which were always present.
49
50The set of CPU model feature macros are defined in the
51:file:`cpukit/score/cpu/CPU/rtems/score/cpu.h` based upon the GNU tools
52multilib variant that is appropriate for the particular CPU model defined on
53the compilation command line.
54
55In each of the architecture specific chapters, this section presents the set of
56features which vary across various implementations of the architecture that may
57be of importance to RTEMS application developers.
58
59The subsections will vary amongst the target architecture chapters as the
60specific features may vary.  However, each port will include a few common
61features such as the CPU Model Name and presence of a hardware Floating Point
62Unit.  The common features are described here.
63
64CPU Model Name
65--------------
66
67The macro ``CPU_MODEL_NAME`` is a string which designates the name of this CPU
68model.  For example, for the MC68020 processor model from the m68k
69architecture, this macro is set to the string "mc68020".
70
71Floating Point Unit
72-------------------
73
74In most architectures, the presence of a floating point unit is an option.  It
75does not matter whether the hardware floating point support is incorporated
76on-chip or is an external coprocessor as long as it appears an FPU per the ISA.
77However, if a hardware FPU is not present, it is possible that the floating
78point emulation library for this CPU is not reentrant and thus context switched
79by RTEMS.
80
81RTEMS provides two feature macros to indicate the FPU configuration:
82
83- CPU_HARDWARE_FP
84  is set to TRUE to indicate that a hardware FPU is present.
85
86- CPU_SOFTWARE_FP
87  is set to TRUE to indicate that a hardware FPU is not present and that the FP
88  software emulation will be context switched.
89
90Multilibs
91=========
92
93Newlib and GCC provide several target libraries like the :file:`libc.a`,
94:file:`libm.a` and :file:`libgcc.a`.  These libraries are artifacts of the GCC
95build process.  Newlib is built together with GCC.  To provide optimal support
96for various chip derivatives and instruction set revisions multiple variants of
97these libraries are available for each architecture.  For example one set may
98use software floating point support and another set may use hardware floating
99point instructions.  These sets of libraries are called *multilibs*.  Each
100library set corresponds to an application binary interface (ABI) and
101instruction set.
102
103A multilib variant can be usually detected via built-in compiler defines at
104compile-time.  This mechanism is used by RTEMS to select for example the
105context switch support for a particular BSP.  The built-in compiler defines
106corresponding to multilibs are the only architecture specific defines allowed
107in the ``cpukit`` area of the RTEMS sources.
108
109Invoking the GCC with the ``-print-multi-lib`` option lists the available
110multilibs.  Each line of the output describes one multilib variant.  The
111default variant is denoted by ``.`` which is selected when no or contradicting
112GCC machine options are selected.  The multilib selection for a target is
113specified by target makefile fragments (see file :file:`t-rtems` in the GCC
114sources and section *The Target Makefile Fragment*
115(https://gcc.gnu.org/onlinedocs/gccint/Target-Fragment.html#Target-Fragment)
116in the *GCC Internals Manual* (https://gcc.gnu.org/onlinedocs/gccint/).
117
118Calling Conventions
119===================
120
121Each high-level language compiler generates subroutine entry and exit code
122based upon a set of rules known as the compiler's calling convention.  These
123rules address the following issues:
124
125- register preservation and usage
126
127- parameter passing
128
129- call and return mechanism
130
131A compiler's calling convention is of importance when interfacing to
132subroutines written in another language either assembly or high-level.  Even
133when the high-level language and target processor are the same, different
134compilers may use different calling conventions.  As a result, calling
135conventions are both processor and compiler dependent.
136
137Calling Mechanism
138-----------------
139
140In each of the architecture specific chapters, this subsection will describe
141the instruction(s) used to perform a *normal* subroutine invocation.  All RTEMS
142directives are invoked as *normal* C language functions so it is important to
143the user application to understand the call and return mechanism.
144
145Register Usage
146--------------
147
148In each of the architecture specific chapters, this subsection will detail the
149set of registers which are *NOT* preserved across subroutine invocations.  The
150registers which are not preserved are assumed to be available for use as
151scratch registers.  Therefore, the contents of these registers should not be
152assumed upon return from any RTEMS directive.
153
154In some architectures, there may be a set of registers made available
155automatically as a side-effect of the subroutine invocation mechanism.
156
157Parameter Passing
158-----------------
159
160In each of the architecture specific chapters, this subsection will describe
161the mechanism by which the parameters or arguments are passed by the caller to
162a subroutine.  In some architectures, all parameters are passed on the stack
163while in others some are passed in registers.
164
165User-Provided Routines
166----------------------
167
168All user-provided routines invoked by RTEMS, such as user extensions, device
169drivers, and MPCI routines, must also adhere to these calling conventions.
170
171Memory Model
172============
173
174A processor may support any combination of memory models ranging from pure
175physical addressing to complex demand paged virtual memory systems.  RTEMS
176supports a flat memory model which ranges contiguously over the processor's
177allowable address space.  RTEMS does not support segmentation or virtual memory
178of any kind.  The appropriate memory model for RTEMS provided by the targeted
179processor and related characteristics of that model are described in this
180chapter.
181
182Flat Memory Model
183-----------------
184
185Most RTEMS target processors can be initialized to support a flat address
186space.  Although the size of addresses varies between architectures, on most
187RTEMS targets, an address is 32-bits wide which defines addresses ranging from
1880x00000000 to 0xFFFFFFFF (4 gigabytes).  Each address is represented by a
18932-bit value and is byte addressable.  The address may be used to reference a
190single byte, word (2-bytes), or long word (4 bytes).  Memory accesses within
191this address space may be performed in little or big endian fashion.
192
193On smaller CPU architectures supported by RTEMS, the address space may only be
19420 or 24 bits wide.
195
196If the CPU model has support for virtual memory or segmentation, it is the
197responsibility of the Board Support Package (BSP) to initialize the MMU
198hardware to perform address translations which correspond to flat memory model.
199
200In each of the architecture specific chapters, this subsection will describe
201any architecture characteristics that differ from this general description.
202
203Interrupt Processing
204====================
205
206Different types of processors respond to the occurrence of an interrupt in its
207own unique fashion. In addition, each processor type provides a control
208mechanism to allow for the proper handling of an interrupt.  The processor
209dependent response to the interrupt modifies the current execution state and
210results in a change in the execution stream.  Most processors require that an
211interrupt handler utilize some special control mechanisms to return to the
212normal processing stream.  Although RTEMS hides many of the processor dependent
213details of interrupt processing, it is important to understand how the RTEMS
214interrupt manager is mapped onto the processor's unique architecture.
215
216RTEMS supports a dedicated interrupt stack for all architectures.  On
217architectures with hardware support for a dedicated interrupt stack, it will be
218initialized such that when an interrupt occurs, the processor automatically
219switches to this dedicated stack.  On architectures without hardware support
220for a dedicated interrupt stack which is separate from those of the tasks,
221RTEMS will support switching to a dedicated stack for interrupt processing.
222
223Without a dedicated interrupt stack, every task in the system must have enough
224stack space to accommodate the worst case stack usage of that particular task
225and the interrupt service routines combined.  By supporting a dedicated
226interrupt stack, RTEMS significantly lowers the stack requirements for each
227task.
228
229A nested interrupt is processed similarly with the exception that since the CPU
230is already executing on the interrupt stack, there is no need to switch to the
231interrupt stack.
232
233The interrupt stacks (one for each configured processor) are statically
234allocated by the application configuration via ``<rtems/confdefs.h>`` in the
235special section ``.rtemsstack``.  This enables an optimal placement of the
236interrupt stacks by the Board Support Package (BSP), e.g. a fast on-chip
237memory.  The amount of memory allocated for each interrupt stack is user
238configured and based upon the ``<rtems/confdefs.h>`` parameter
239``CONFIGURE_INTERRUPT_STACK_SIZE``.  This parameter is described in detail in
240the Configuring a System chapter of the User's Guide.  Since interrupts are
241disabled during the sequential system initialization and the
242``_Thread_Start_multitasking()`` function does not return to the caller each
243interrupt stack may be used for the initialization stack on the corresponding
244processor.
245
246In each of the architecture specific chapters, this section discusses the
247interrupt response and control mechanisms of the architecture as they pertain
248to RTEMS.
249
250Vectoring of an Interrupt Handler
251---------------------------------
252
253In each of the architecture specific chapters, this subsection will describe
254the architecture specific details of the interrupt vectoring process.  In
255particular, it should include a description of the Interrupt Stack Frame (ISF).
256
257Interrupt Levels
258----------------
259
260In each of the architecture specific chapters, this subsection will describe
261how the interrupt levels available on this particular architecture are mapped
262onto the 255 reserved in the task mode.  The interrupt level value of zero (0)
263should always mean that interrupts are enabled.
264
265Any use of an interrupt level that is is not undefined on a particular
266architecture may result in behavior that is unpredictable.
267
268Disabling of Interrupts by RTEMS
269--------------------------------
270
271During the execution of directive calls, critical sections of code may be
272executed.  When these sections are encountered, RTEMS disables all external
273interrupts before the execution of this section and restores them to the
274previous level upon completion of the section.  RTEMS has been optimized to
275ensure that interrupts are disabled for the shortest number of instructions
276possible.  Since the precise number of instructions and their execution time
277varies based upon target CPU family, CPU model, board memory speed, compiler
278version, and optimization level, it is not practical to provide the precise
279number for all possible RTEMS configurations.
280
281Historically, the measurements were made by hand analyzing and counting the
282execution time of instruction sequences during interrupt disable critical
283sections.  For reference purposes, on a 16 Mhz Motorola MC68020, the maximum
284interrupt disable period was typically approximately ten (10) to thirteen (13)
285microseconds.  This architecture was memory bound and had a slow bit scan
286instruction.  In contrast, during the same period a 14 Mhz SPARC would have a
287worst case disable time of approximately two (2) to three (3) microseconds
288because it had a single cycle bit scan instruction and used fewer cycles for
289memory accesses.
290
291If you are interested in knowing the worst case execution time for a particular
292version of RTEMS, please contact OAR Corporation and we will be happy to
293product the results as a consulting service.
294
295Non-maskable interrupts (NMI) cannot be disabled, and ISRs which execute at
296this level MUST NEVER issue RTEMS system calls.  If a directive is invoked,
297unpredictable results may occur due to the inability of RTEMS to protect its
298critical sections.  However, ISRs that make no system calls may safely execute
299as non-maskable interrupts.
300
301Default Fatal Error Processing
302==============================
303
304Upon detection of a fatal error by either the application or RTEMS during
305initialization the ``rtems_fatal_error_occurred`` directive supplied by the
306Fatal Error Manager is invoked.  The Fatal Error Manager will invoke the
307user-supplied fatal error handlers.  If no user-supplied handlers are
308configured or all of them return without taking action to shutdown the
309processor or reset, a default fatal error handler is invoked.
310
311Most of the action performed as part of processing the fatal error are
312described in detail in the Fatal Error Manager chapter in the User's Guide.
313However, the if no user provided extension or BSP specific fatal error handler
314takes action, the final default action is to invoke a CPU architecture specific
315function.  Typically this function disables interrupts and halts the processor.
316
317In each of the architecture specific chapters, this describes the precise
318operations of the default CPU specific fatal error handler.
319
320Symmetric Multiprocessing
321=========================
322
323This section contains information about the Symmetric Multiprocessing (SMP)
324status of a particular architecture.
325
326Thread-Local Storage
327====================
328
329In order to support thread-local storage (TLS) the CPU port must implement the
330facilities mandated by the application binary interface (ABI) of the CPU
331architecture.  The CPU port must initialize the TLS area in the
332``_CPU_Context_Initialize()`` function.  There are support functions available
333via ``#include <rtems/score/tls.h>`` which implement Variants I and II
334according to :cite:`Drepper:2013:TLS`.
335
336``_TLS_TCB_at_area_begin_initialize()``
337    Uses Variant I, TLS offsets emitted by linker takes the TCB into account.
338    For a reference implementation see :file:`cpukit/score/cpu/arm/cpu.c`.
339
340``_TLS_TCB_before_TLS_block_initialize()``
341    Uses Variant I, TLS offsets emitted by linker neglects the TCB.  For a
342    reference implementation see
343    :file:`c/src/lib/libcpu/powerpc/new-exceptions/cpu.c`.
344
345``_TLS_TCB_after_TLS_block_initialize()``
346    Uses Variant II.  For a reference implementation see
347    :file:`cpukit/score/cpu/sparc/cpu.c`.
348
349The board support package (BSP) must provide the following sections and symbols
350in its linker command file:
351
352.. code-block:: c
353
354    .tdata : {
355      _TLS_Data_begin = .;
356      *(.tdata .tdata.* .gnu.linkonce.td.*)
357      _TLS_Data_end = .;
358    }
359    .tbss : {
360      _TLS_BSS_begin = .;
361      *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
362      _TLS_BSS_end = .;
363    }
364    _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
365    _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
366    _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
367    _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
368    _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
369    _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
370
371CPU counter
372===========
373
374The CPU support must implement the CPU counter interface.  A CPU counter is
375some free-running counter.  It ticks usually with a frequency close to the CPU
376or system bus clock.  On some architectures the actual implementation is board
377support package dependent.  The CPU counter is used for profiling of low-level
378functions.  It is also used to implement two busy wait functions
379``rtems_counter_delay_ticks()`` and ``rtems_counter_delay_nanoseconds()`` which
380may be used in device drivers.  It may be also used as an entropy source for
381random number generators.
382
383The CPU counter interface uses a CPU port specific unsigned integer type
384``CPU_Counter_ticks`` to represent CPU counter values.  The CPU port must
385provide the following two functions
386
387- ``_CPU_Counter_read()`` to read the current CPU counter value, and
388
389- ``_CPU_Counter_difference()`` to get the difference between two CPU
390  counter values.
391
392Interrupt Profiling
393===================
394
395The RTEMS profiling needs support by the CPU port for the interrupt entry and
396exit times.  In case profiling is enabled via the RTEMS build configuration
397option ``--enable-profiling`` (in this case the pre-processor symbol
398``RTEMS_PROFILING`` is defined) the CPU port may provide data for the interrupt
399entry and exit times of the outer-most interrupt.  The CPU port can feed
400interrupt entry and exit times with the
401``_Profiling_Outer_most_interrupt_entry_and_exit()`` function (``#include
402<rtems/score/profiling.h>``).  For an example please have a look at
403:file:`cpukit/score/cpu/arm/arm_exc_interrupt.S`.
404
405Board Support Packages
406======================
407
408An RTEMS Board Support Package (BSP) must be designed to support a particular
409processor model and target board combination.
410
411In each of the architecture specific chapters, this section will present a
412discussion of architecture specific BSP issues.  For more information on
413developing a BSP, refer to *RTEMS BSP and Driver Guide* chapter titled
414``Board Support Packages`` in the *RTEMS Classic API Guide*.
415
416System Reset
417------------
418
419An RTEMS based application is initiated or re-initiated when the processor is
420reset or transfer is passed to it from a boot monitor or ROM monitor.
421
422In each of the architecture specific chapters, this subsection describes the
423actions that the BSP must take assuming the application gets control
424when the microprocessor is reset.
Note: See TracBrowser for help on using the repository browser.