[rtems-central commit] spec: Add interrupt manager extension

Sebastian Huber sebh at rtems.org
Mon Jul 12 12:57:20 UTC 2021


Module:    rtems-central
Branch:    master
Commit:    a615014cfb188ef151ba4e11bcc808f4d6d2aefd
Changeset: http://git.rtems.org/rtems-central/commit/?id=a615014cfb188ef151ba4e11bcc808f4d6d2aefd

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Thu Jun 10 18:01:15 2021 +0200

spec: Add interrupt manager extension

---

 spec/constraint/request-response.yml               |  12 ++
 spec/rtems/intr/constraint/not-within-server.yml   |  13 +++
 .../intr/constraint/server-entry-initialized.yml   |  13 +++
 .../server-entry-not-while-action-prepend.yml      |  13 +++
 .../constraint/server-entry-not-while-move.yml     |  13 +++
 .../constraint/server-entry-not-while-pending.yml  |  13 +++
 .../constraint/server-entry-not-while-submit.yml   |  13 +++
 .../intr/constraint/server-request-initialized.yml |  12 ++
 .../server-request-not-while-set-vector.yml        |  13 +++
 .../constraint/server-request-not-while-submit.yml |  13 +++
 spec/rtems/intr/if/get-affinity.yml                |  70 ++++++++++++
 spec/rtems/intr/if/group.yml                       |  72 ++++++++++++
 spec/rtems/intr/if/handler-install.yml             | 127 +++++++++++++++++++++
 spec/rtems/intr/if/handler-iterate.yml             |  73 ++++++++++++
 spec/rtems/intr/if/handler-remove.yml              |  69 +++++++++++
 spec/rtems/intr/if/handler.yml                     |  20 ++++
 spec/rtems/intr/if/header-2.yml                    |  16 +++
 spec/rtems/intr/if/header.yml                      |   3 +-
 spec/rtems/intr/if/is-replace.yml                  |  31 +++++
 spec/rtems/intr/if/is-shared.yml                   |  31 +++++
 spec/rtems/intr/if/is-unique.yml                   |  31 +++++
 spec/rtems/intr/if/isr-entry.yml                   |   3 +-
 spec/rtems/intr/if/per-handler-routine.yml         |  27 +++++
 spec/rtems/intr/if/replace.yml                     |  21 ++++
 spec/rtems/intr/if/server-action-prepend.yml       |  70 ++++++++++++
 spec/rtems/intr/if/server-action.yml               |  46 ++++++++
 spec/rtems/intr/if/server-config.yml               |  85 ++++++++++++++
 spec/rtems/intr/if/server-control.yml              |  82 +++++++++++++
 spec/rtems/intr/if/server-create.yml               |  59 ++++++++++
 spec/rtems/intr/if/server-default.yml              |  20 ++++
 spec/rtems/intr/if/server-delete.yml               |  51 +++++++++
 spec/rtems/intr/if/server-entry-destroy.yml        |  42 +++++++
 spec/rtems/intr/if/server-entry-initialize.yml     |  58 ++++++++++
 spec/rtems/intr/if/server-entry-move.yml           |  63 ++++++++++
 spec/rtems/intr/if/server-entry-submit.yml         |  58 ++++++++++
 spec/rtems/intr/if/server-entry.yml                |  57 +++++++++
 spec/rtems/intr/if/server-handler-install.yml      | 106 +++++++++++++++++
 spec/rtems/intr/if/server-handler-iterate.yml      |  74 ++++++++++++
 spec/rtems/intr/if/server-handler-remove.yml       |  73 ++++++++++++
 spec/rtems/intr/if/server-initialize.yml           |  86 ++++++++++++++
 spec/rtems/intr/if/server-move.yml                 |  69 +++++++++++
 spec/rtems/intr/if/server-request-destroy.yml      |  43 +++++++
 spec/rtems/intr/if/server-request-initialize.yml   |  68 +++++++++++
 spec/rtems/intr/if/server-request-set-vector.yml   |  62 ++++++++++
 spec/rtems/intr/if/server-request-submit.yml       |  57 +++++++++
 spec/rtems/intr/if/server-request.yml              |  41 +++++++
 spec/rtems/intr/if/server-resume.yml               |  49 ++++++++
 spec/rtems/intr/if/server-set-affinity.yml         |  79 +++++++++++++
 spec/rtems/intr/if/server-suspend.yml              |  49 ++++++++
 spec/rtems/intr/if/set-affinity.yml                |  76 ++++++++++++
 spec/rtems/intr/if/shared.yml                      |  21 ++++
 spec/rtems/intr/if/unique.yml                      |  22 ++++
 spec/score/chain/if/control.yml                    |  12 ++
 spec/score/chain/if/header.yml                     |  14 +++
 spec/score/chain/if/node.yml                       |  12 ++
 55 files changed, 2423 insertions(+), 3 deletions(-)

diff --git a/spec/constraint/request-response.yml b/spec/constraint/request-response.yml
new file mode 100644
index 0000000..be8a8d8
--- /dev/null
+++ b/spec/constraint/request-response.yml
@@ -0,0 +1,12 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: requirement-refinement
+  uid: /req/usage-constraints
+rationale: null
+text: |
+  The directive sends a request to another task and waits for a response.  This
+  may cause the calling task to be blocked and unblocked.
+type: constraint
diff --git a/spec/rtems/intr/constraint/not-within-server.yml b/spec/rtems/intr/constraint/not-within-server.yml
new file mode 100644
index 0000000..baefd3c
--- /dev/null
+++ b/spec/rtems/intr/constraint/not-within-server.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: requirement-refinement
+  uid: /req/usage-constraints
+rationale: null
+text: |
+  The directive shall not be called from within the context of an interrupt
+  server.  Calling the directive from within the context of an interrupt server
+  is undefined behaviour.
+type: constraint
diff --git a/spec/rtems/intr/constraint/server-entry-initialized.yml b/spec/rtems/intr/constraint/server-entry-initialized.yml
new file mode 100644
index 0000000..ae69f8d
--- /dev/null
+++ b/spec/rtems/intr/constraint/server-entry-initialized.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: requirement-refinement
+  uid: /req/usage-constraints
+rationale: null
+text: |
+  The interrupt server entry shall have been initialized by
+  ${../if/server-entry-initialize:/name} and further optional calls to
+  ${../if/server-action-prepend:/name}.
+type: constraint
diff --git a/spec/rtems/intr/constraint/server-entry-not-while-action-prepend.yml b/spec/rtems/intr/constraint/server-entry-not-while-action-prepend.yml
new file mode 100644
index 0000000..cc8c464
--- /dev/null
+++ b/spec/rtems/intr/constraint/server-entry-not-while-action-prepend.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: requirement-refinement
+  uid: /req/usage-constraints
+rationale: null
+text: |
+  The directive shall not be called concurrently with
+  ${../if/server-action-prepend:/name} with the same interrupt server entry.
+  Calling the directive under this condition is undefined behaviour.
+type: constraint
diff --git a/spec/rtems/intr/constraint/server-entry-not-while-move.yml b/spec/rtems/intr/constraint/server-entry-not-while-move.yml
new file mode 100644
index 0000000..1f82705
--- /dev/null
+++ b/spec/rtems/intr/constraint/server-entry-not-while-move.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: requirement-refinement
+  uid: /req/usage-constraints
+rationale: null
+text: |
+  The directive shall not be called concurrently with
+  ${../if/server-entry-move:/name} with the same interrupt server entry.
+  Calling the directive under this condition is undefined behaviour.
+type: constraint
diff --git a/spec/rtems/intr/constraint/server-entry-not-while-pending.yml b/spec/rtems/intr/constraint/server-entry-not-while-pending.yml
new file mode 100644
index 0000000..685aaf7
--- /dev/null
+++ b/spec/rtems/intr/constraint/server-entry-not-while-pending.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: requirement-refinement
+  uid: /req/usage-constraints
+rationale: null
+text: |
+  The directive shall not be called while the interrupt server entry is pending
+  on or serviced by its current interrupt server.  Calling the directive under
+  these conditions is undefined behaviour.
+type: constraint
diff --git a/spec/rtems/intr/constraint/server-entry-not-while-submit.yml b/spec/rtems/intr/constraint/server-entry-not-while-submit.yml
new file mode 100644
index 0000000..8942379
--- /dev/null
+++ b/spec/rtems/intr/constraint/server-entry-not-while-submit.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: requirement-refinement
+  uid: /req/usage-constraints
+rationale: null
+text: |
+  The directive shall not be called concurrently with
+  ${../if/server-entry-submit:/name} with the same interrupt server entry.
+  Calling the directive under this condition is undefined behaviour.
+type: constraint
diff --git a/spec/rtems/intr/constraint/server-request-initialized.yml b/spec/rtems/intr/constraint/server-request-initialized.yml
new file mode 100644
index 0000000..407eeec
--- /dev/null
+++ b/spec/rtems/intr/constraint/server-request-initialized.yml
@@ -0,0 +1,12 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: requirement-refinement
+  uid: /req/usage-constraints
+rationale: null
+text: |
+  The interrupt server request shall have been initialized by
+  ${../if/server-request-initialize:/name}.
+type: constraint
diff --git a/spec/rtems/intr/constraint/server-request-not-while-set-vector.yml b/spec/rtems/intr/constraint/server-request-not-while-set-vector.yml
new file mode 100644
index 0000000..94cd095
--- /dev/null
+++ b/spec/rtems/intr/constraint/server-request-not-while-set-vector.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: requirement-refinement
+  uid: /req/usage-constraints
+rationale: null
+text: |
+  The directive shall not be called concurrently with
+  ${../if/server-request-set-vector:/name} with the same interrupt server
+  request.  Calling the directive under this condition is undefined behaviour.
+type: constraint
diff --git a/spec/rtems/intr/constraint/server-request-not-while-submit.yml b/spec/rtems/intr/constraint/server-request-not-while-submit.yml
new file mode 100644
index 0000000..24a8351
--- /dev/null
+++ b/spec/rtems/intr/constraint/server-request-not-while-submit.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: requirement-refinement
+  uid: /req/usage-constraints
+rationale: null
+text: |
+  The directive shall not be called concurrently with
+  ${../if/server-request-submit:/name} with the same interrupt server request.
+  Calling the directive under this condition is undefined behaviour.
+type: constraint
diff --git a/spec/rtems/intr/if/get-affinity.yml b/spec/rtems/intr/if/get-affinity.yml
new file mode 100644
index 0000000..9e608ec
--- /dev/null
+++ b/spec/rtems/intr/if/get-affinity.yml
@@ -0,0 +1,70 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Gets the processor affinity set of the interrupt vector.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${vector-number:/name} ${.:/params[0]/name}
+    - ${/c/if/size_t:/name} ${.:/params[1]/name}
+    - ${/c/if/cpu_set_t:/name} *${.:/params[2]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-isr
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/directive-no-preempt
+name: rtems_interrupt_get_affinity
+notes: null
+params:
+- description: |
+    is the interrupt vector number.
+  dir: null
+  name: vector
+- description: |
+    is the size of the processor set referenced by ${.:/params[2]/name} in
+    bytes.
+  dir: null
+  name: affinity_size
+- description: |
+    is the pointer to a ${/c/if/cpu_set_t:/name} object.  When the directive
+    call is successful, the processor affinity set of the interrupt vector will
+    be stored in this object.  A set bit in the processor set means that the
+    corresponding processor is in the processor affinity set of the interrupt
+    vector, otherwise the bit is cleared.
+  dir: out
+  name: affinity
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      The ${.:/params[2]/name} parameter was ${/c/if/null:/name}.
+    value: ${../../status/if/invalid-address:/name}
+  - description: |
+      There was no interrupt vector associated with the number specified by
+      ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+  - description: |
+      The size specified by ${.:/params[1]/name} of the processor set was too
+      small for the processor affinity set of the interrupt vector.
+    value: ${../../status/if/invalid-size:/name}
+type: interface
diff --git a/spec/rtems/intr/if/group.yml b/spec/rtems/intr/if/group.yml
index 22a0e22..5a5e8c2 100644
--- a/spec/rtems/intr/if/group.yml
+++ b/spec/rtems/intr/if/group.yml
@@ -61,6 +61,78 @@ links:
   uid: lock-member
 - role: placement-order
   uid: lock-reference
+- role: placement-order
+  uid: shared
+- role: placement-order
+  uid: unique
+- role: placement-order
+  uid: replace
+- role: placement-order
+  uid: is-shared
+- role: placement-order
+  uid: is-unique
+- role: placement-order
+  uid: is-replace
+- role: placement-order
+  uid: handler-install
+- role: placement-order
+  uid: handler-remove
+- role: placement-order
+  uid: get-affinity
+- role: placement-order
+  uid: set-affinity
+- role: placement-order
+  uid: handler-iterate
+- role: placement-order
+  uid: server-default
+- role: placement-order
+  uid: server-config
+- role: placement-order
+  uid: server-control
+- role: placement-order
+  uid: server-initialize
+- role: placement-order
+  uid: server-create
+- role: placement-order
+  uid: server-handler-install
+- role: placement-order
+  uid: server-handler-remove
+- role: placement-order
+  uid: server-set-affinity
+- role: placement-order
+  uid: server-delete
+- role: placement-order
+  uid: server-suspend
+- role: placement-order
+  uid: server-resume
+- role: placement-order
+  uid: server-move
+- role: placement-order
+  uid: server-handler-iterate
+- role: placement-order
+  uid: server-action
+- role: placement-order
+  uid: server-entry
+- role: placement-order
+  uid: server-entry-initialize
+- role: placement-order
+  uid: server-action-prepend
+- role: placement-order
+  uid: server-entry-destroy
+- role: placement-order
+  uid: server-entry-submit
+- role: placement-order
+  uid: server-entry-move
+- role: placement-order
+  uid: server-request
+- role: placement-order
+  uid: server-request-initialize
+- role: placement-order
+  uid: server-request-set-vector
+- role: placement-order
+  uid: server-request-destroy
+- role: placement-order
+  uid: server-request-submit
 name: Interrupt Manager
 text: |
   The Classic API shall provide an interface to the Interrupt Manager.
diff --git a/spec/rtems/intr/if/handler-install.yml b/spec/rtems/intr/if/handler-install.yml
new file mode 100644
index 0000000..59f5e6e
--- /dev/null
+++ b/spec/rtems/intr/if/handler-install.yml
@@ -0,0 +1,127 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Installs the interrupt handler routine and argument at the interrupt vector.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${vector-number:/name} ${.:/params[0]/name}
+    - const char *${.:/params[1]/name}
+    - ${../../option/if/option:/name} ${.:/params[2]/name}
+    - ${handler:/name} ${.:/params[3]/name}
+    - void *${.:/params[4]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: |
+  One of the following mutually exclusive options
+
+  * ${unique:/name},
+
+  * ${shared:/name}, and
+
+  * ${replace:/name}
+
+  shall be set in the ${.:/params[2]/name} parameter.
+
+  The handler routine will be called with the argument specified by
+  ${.:/params[4]/name} when dispatched.  The order in which shared
+  interrupt handlers are dispatched for one vector is defined by the
+  installation order.  The first installed handler is dispatched first.
+
+  If the option ${unique:/name} is set, then it will be ensured that the
+  handler will be the only one for the interrupt vector.
+
+  If the option ${shared:/name} is set, then multiple handler may be installed
+  for the interrupt vector.
+
+  If the option ${replace:/name} is set, then the handler specified by
+  ${.:/params[3]/name} will replace the first handler with the same argument
+  for the interrupt vector if it exists, otherwise an error status will be
+  returned.  A second handler with the same argument for the interrupt vector
+  will remain unchanged.  The new handler will inherit the unique or shared
+  options from the replaced handler.
+
+  An informative description may be provided in ${.:/params[1]/name}.  It may
+  be used for system debugging and diagnostic tools.  The referenced string has
+  to be persistent as long as the handler is installed.
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/object-allocator
+name: rtems_interrupt_handler_install
+notes: null
+params:
+- description: |
+    is the interrupt vector number.
+  dir: null
+  name: vector
+- description: |
+    is the descriptive information of the interrupt handler to install.
+  dir: null
+  name: info
+- description: |
+    is the interrupt handler install option set.
+  dir: null
+  name: options
+- description: |
+    is the interrupt handler routine to install.
+  dir: null
+  name: routine
+- description: |
+    is the interrupt handler argument to install.
+  dir: null
+  name: arg
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      The service was not initialized.
+    value: ${../../status/if/incorrect-state:/name}
+  - description: |
+      The ${.:/params[3]/name} parameter was ${/c/if/null:/name}.
+    value: ${../../status/if/invalid-address:/name}
+  - description: |
+      There was no interrupt vector associated with the number specified by
+      ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+  - description: |
+      The directive was called from within interrupt context.
+    value: ${../../status/if/called-from-isr:/name}
+  - description: |
+      There was not enough memory available to allocate data structures to
+      install the handler.
+    value: ${../../status/if/no-memory:/name}
+  - description: |
+      The ${unique:/name} option was set in ${.:/params[2]/name} and the
+      interrupt vector was already occupied by a handler.
+    value: ${../../status/if/resource-in-use:/name}
+  - description: |
+      The ${shared:/name} option was set in ${.:/params[2]/name} and the
+      interrupt vector was already occupied by a unique handler.
+    value: ${../../status/if/resource-in-use:/name}
+  - description: |
+      The handler specified by ${.:/params[3]/name} was already installed for
+      the interrupt vector specified by ${.:/params[0]/name} with an argument
+      equal to the argument specified by ${.:/params[4]/name}.
+    value: ${../../status/if/too-many:/name}
+  - description: |
+      The ${replace:/name} option was set in ${.:/params[2]/name} and no
+      handler to replace was installed.
+    value: ${../../status/if/unsatisfied:/name}
+type: interface
diff --git a/spec/rtems/intr/if/handler-iterate.yml b/spec/rtems/intr/if/handler-iterate.yml
new file mode 100644
index 0000000..a4015e1
--- /dev/null
+++ b/spec/rtems/intr/if/handler-iterate.yml
@@ -0,0 +1,73 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Iterates over all interrupt handler installed at the interrupt vector.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${vector-number:/name} ${.:/params[0]/name}
+    - ${per-handler-routine:/name} ${.:/params[1]/name}
+    - void *${.:/params[2]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: |
+  For each installed handler at the interrupt vector the visitor function
+  specified by ${.:/params[1]/name} will be called with the argument specified
+  by ${.:/params[2]/name} and the handler information, options, routine and
+  argument.
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/object-allocator
+name: rtems_interrupt_handler_iterate
+notes: |
+  The directive is intended for system information and diagnostics.
+ 
+  Never install or remove an interrupt handler within the visitor function.
+  This may result in a deadlock.
+params:
+- description: |
+    is the interrupt vector number.
+  dir: null
+  name: vector
+- description: |
+    is the visitor routine.
+  dir: null
+  name: routine
+- description: 
+    is the visitor argument.
+  dir: null
+  name: arg
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      The service was not initialized.
+    value: ${../../status/if/incorrect-state:/name}
+  - description: |
+      The ${.:/params[1]/name} parameter was ${/c/if/null:/name}.
+    value: ${../../status/if/invalid-address:/name}
+  - description: |
+      There was no interrupt vector associated with the number specified by
+      ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+  - description: |
+      The directive was called from within interrupt context.
+    value: ${../../status/if/called-from-isr:/name}
+type: interface
diff --git a/spec/rtems/intr/if/handler-remove.yml b/spec/rtems/intr/if/handler-remove.yml
new file mode 100644
index 0000000..336fcef
--- /dev/null
+++ b/spec/rtems/intr/if/handler-remove.yml
@@ -0,0 +1,69 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Removes the interrupt handler routine and argument from the interrupt vector.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${vector-number:/name} ${.:/params[0]/name}
+    - ${handler:/name} ${.:/params[1]/name}
+    - void *${.:/params[2]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/object-allocator
+name: rtems_interrupt_handler_remove
+notes: null
+params:
+- description: |
+    is the interrupt vector number.
+  dir: null
+  name: vector
+- description: |
+    is the interrupt handler routine to remove.
+  dir: null
+  name: routine
+- description: |
+    is the interrupt handler argument to remove.
+  dir: null
+  name: arg
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      The service was not initialized.
+    value: ${../../status/if/incorrect-state:/name}
+  - description: |
+      The ${.:/params[1]/name} parameter was ${/c/if/null:/name}.
+    value: ${../../status/if/invalid-address:/name}
+  - description: |
+      There was no interrupt vector associated with the number specified by
+      ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+  - description: |
+      The directive was called from within interrupt context.
+    value: ${../../status/if/called-from-isr:/name}
+  - description: |
+      There was no handler routine and argument pair installed specified by
+      ${.:/params[1]/name} and ${.:/params[2]/name}.
+    value: ${../../status/if/unsatisfied:/name}
+type: interface
diff --git a/spec/rtems/intr/if/handler.yml b/spec/rtems/intr/if/handler.yml
new file mode 100644
index 0000000..44cb85f
--- /dev/null
+++ b/spec/rtems/intr/if/handler.yml
@@ -0,0 +1,20 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Interrupt handler routines shall have this type.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default: void ( *${.:/name} )( void * )
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: typedef
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+name: rtems_interrupt_handler
+notes: null
+type: interface
diff --git a/spec/rtems/intr/if/header-2.yml b/spec/rtems/intr/if/header-2.yml
new file mode 100644
index 0000000..6ab4d7a
--- /dev/null
+++ b/spec/rtems/intr/if/header-2.yml
@@ -0,0 +1,16 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  This header file defines the Interrupt Manager Extension API.
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+index-entries: []
+interface-type: header-file
+links:
+- role: interface-placement
+  uid: /if/domain
+- role: interface-ingroup
+  uid: group
+path: rtems/irq-extension.h
+prefix: cpukit/include
+type: interface
diff --git a/spec/rtems/intr/if/header.yml b/spec/rtems/intr/if/header.yml
index dd23f99..8663805 100644
--- a/spec/rtems/intr/if/header.yml
+++ b/spec/rtems/intr/if/header.yml
@@ -1,5 +1,6 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
-brief: This header file defines the Interrupt Manager API.
+brief: |
+  This header file defines the Interrupt Manager API.
 copyrights:
 - Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
 enabled-by: true
diff --git a/spec/rtems/intr/if/is-replace.yml b/spec/rtems/intr/if/is-replace.yml
new file mode 100644
index 0000000..ce84fd6
--- /dev/null
+++ b/spec/rtems/intr/if/is-replace.yml
@@ -0,0 +1,31 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Checks if the interrupt handler replace option is set.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default: |
+    ( ( ${.:/params[0]/name} ) & ${replace:/name} )
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: macro
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup-hidden
+  uid: group
+name: RTEMS_INTERRUPT_IS_REPLACE
+notes: null
+params:
+- description: 
+    is the interrupt handler option set to check.
+  dir: null
+  name: _options
+return:
+  return: |
+    Returns true, if the interrupt handler replace option ${replace:/name} is
+    set, otherwise false.
+  return-values: []
+type: interface
diff --git a/spec/rtems/intr/if/is-shared.yml b/spec/rtems/intr/if/is-shared.yml
new file mode 100644
index 0000000..94ed576
--- /dev/null
+++ b/spec/rtems/intr/if/is-shared.yml
@@ -0,0 +1,31 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Checks if the interrupt handler shared option is set.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default: |
+    ( ( ${.:/params[0]/name} ) & ${shared:/name} )
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: macro
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup-hidden
+  uid: group
+name: RTEMS_INTERRUPT_IS_SHARED
+notes: null
+params:
+- description: |
+    is the interrupt handler option set to check.
+  dir: null
+  name: _options
+return:
+  return: |
+    Returns true, if the interrupt handler shared option ${shared:/name} is
+    set, otherwise false.
+  return-values: []
+type: interface
diff --git a/spec/rtems/intr/if/is-unique.yml b/spec/rtems/intr/if/is-unique.yml
new file mode 100644
index 0000000..301d350
--- /dev/null
+++ b/spec/rtems/intr/if/is-unique.yml
@@ -0,0 +1,31 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Checks if the interrupt handler unique option is set.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default: |
+    ( ( ${.:/params[0]/name} ) & ${unique:/name} )
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: macro
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup-hidden
+  uid: group
+name: RTEMS_INTERRUPT_IS_UNIQUE
+notes: null
+params:
+- description: |
+    is the interrupt handler option set to check.
+  dir: null
+  name: _options
+return:
+  return: |
+    Returns true, if the interrupt handler unique option ${unique:/name} is
+    set, otherwise false.
+  return-values: []
+type: interface
diff --git a/spec/rtems/intr/if/isr-entry.yml b/spec/rtems/intr/if/isr-entry.yml
index fa4c706..1c084f8 100644
--- a/spec/rtems/intr/if/isr-entry.yml
+++ b/spec/rtems/intr/if/isr-entry.yml
@@ -1,7 +1,6 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: |
-  Interrupt service routines installed by ${catch:/name} shall have this
-  function pointer type.
+  Interrupt service routines installed by ${catch:/name} shall have this type.
 copyrights:
 - Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
 - Copyright (C) 1988, 2008 On-Line Applications Research Corporation (OAR)
diff --git a/spec/rtems/intr/if/per-handler-routine.yml b/spec/rtems/intr/if/per-handler-routine.yml
new file mode 100644
index 0000000..3204b76
--- /dev/null
+++ b/spec/rtems/intr/if/per-handler-routine.yml
@@ -0,0 +1,27 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Visitor routines invoked by ${handler-iterate:/name} shall have this type.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default: |
+    void ( *${.:/name} )(
+      void *,
+      const char *,
+      ${../../option/if/option:/name},
+      ${handler:/name},
+      void *
+    )
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: typedef
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+name: rtems_interrupt_per_handler_routine
+notes: null
+type: interface
diff --git a/spec/rtems/intr/if/replace.yml b/spec/rtems/intr/if/replace.yml
new file mode 100644
index 0000000..e9955ba
--- /dev/null
+++ b/spec/rtems/intr/if/replace.yml
@@ -0,0 +1,21 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  This interrupt handler install option requests that the interrupt handler
+  replaces the first handler with the same argument.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default: ( (${../../option/if/option:/name}) 0x00000002 )
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: define
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+name: RTEMS_INTERRUPT_REPLACE
+notes: null
+type: interface
diff --git a/spec/rtems/intr/if/server-action-prepend.yml b/spec/rtems/intr/if/server-action-prepend.yml
new file mode 100644
index 0000000..156b438
--- /dev/null
+++ b/spec/rtems/intr/if/server-action-prepend.yml
@@ -0,0 +1,70 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Prepends the interrupt server action to the list of actions of the interrupt
+  server entry.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${server-entry:/name} *${.:/params[0]/name}
+    - ${server-action:/name} *${.:/params[1]/name}
+    - ${handler:/name} ${.:/params[2]/name}
+    - void *${.:/params[3]/name}
+    return: void
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-isr
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/directive-no-preempt
+- role: constraint
+  uid: ../constraint/server-entry-initialized
+- role: constraint
+  uid: ../constraint/server-entry-not-while-action-prepend
+- role: constraint
+  uid: ../constraint/server-entry-not-while-move
+- role: constraint
+  uid: ../constraint/server-entry-not-while-submit
+- role: constraint
+  uid: ../constraint/server-entry-not-while-pending
+name: rtems_interrupt_server_action_prepend
+notes: |
+  No error checking is performed by the directive.
+params:
+- description: |
+    is the interrupt server entry to prepend the interrupt server action.  It
+    shall have been initialized via ${server-entry-initialize:/name}.
+  dir: inout
+  name: entry
+- description: |
+   is the interrupt server action to initialize and prepend to the list of
+   actions of the entry.
+  dir: out
+  name: action
+- description: |
+    is the interrupt handler routine to set in the action.
+  dir: null
+  name: routine
+- description: |
+    is the interrupt handler argument to set in the action.
+  dir: null
+  name: arg
+return:
+  return: null
+  return-values: []
+type: interface
diff --git a/spec/rtems/intr/if/server-action.yml b/spec/rtems/intr/if/server-action.yml
new file mode 100644
index 0000000..12a459b
--- /dev/null
+++ b/spec/rtems/intr/if/server-action.yml
@@ -0,0 +1,46 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  This structure represents an interrupt server action.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+- default:
+    brief: |
+      This member is the reference to the next action or ${/c/if/null:/name}.
+    definition: struct rtems_interrupt_server_action *${.:name}
+    description: null
+    kind: member
+    name: next
+  variants: []
+- default:
+    brief: |
+      This member is the interrupt handler.
+    definition: ${handler:/name} ${.:name}
+    description: null
+    kind: member
+    name: handler
+  variants: []
+- default:
+    brief: |
+      This member is the interrupt handler argument.
+    definition: void *${.:name}
+    description: null
+    kind: member
+    name: arg
+  variants: []
+definition-kind: typedef-and-struct
+description: null
+enabled-by: true
+index-entries: []
+interface-type: struct
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+name: rtems_interrupt_server_action
+notes: |
+  This structure shall be treated as an opaque data type from the
+  ${/glossary/api:/term} point of view.  Members shall not be accessed
+  directly.
+type: interface
diff --git a/spec/rtems/intr/if/server-config.yml b/spec/rtems/intr/if/server-config.yml
new file mode 100644
index 0000000..5f44d2b
--- /dev/null
+++ b/spec/rtems/intr/if/server-config.yml
@@ -0,0 +1,85 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  This structure defines an interrupt server configuration.
+copyrights:
+- Copyright (C) 2020, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+- default:
+    brief: |
+      This member is the task name of the interrupt server.
+    definition: ${../../type/if/name:/name} ${.:name}
+    description: null
+    kind: member
+    name: name
+  variants: []
+- default:
+    brief: |
+      This member is the initial ${/glossary/priority-task:/term} of the
+      interrupt server.
+    definition: ${../../type/if/priority:/name} ${.:name}
+    description: null
+    kind: member
+    name: priority
+  variants: []
+- default:
+    brief: |
+      This member is the task storage area of the interrupt server.
+    definition: void *${.:name}
+    description: |
+      It shall be ${/c/if/null:/name} for interrupt servers created by
+      ${server-create:/name}.
+    kind: member
+    name: storage_area
+  variants: []
+- default:
+    brief: |
+      This member is the task storage size of the interrupt server.
+    definition: ${/c/if/size_t:/name} ${.:name}
+    description: |
+      For interrupt servers created by ${server-create:/name} this is the task
+      stack size.
+    kind: member
+    name: storage_size
+  variants: []
+- default:
+    brief: |
+      This member is the initial mode set of the interrupt server.
+    definition: ${../../mode/if/mode:/name} ${.:name}
+    description: null
+    kind: member
+    name: modes
+  variants: []
+- default:
+    brief: |
+      This member is the attribute set of the interrupt server.
+    definition: ${../../attr/if/attribute:/name} ${.:name}
+    description: null
+    kind: member
+    name: attributes
+  variants: []
+- default:
+    brief: |
+      This member is an optional handler to destroy the interrupt server
+      control handed over to ${server-create:/name}.
+    definition: void ( *${.:name} )( ${server-control:/name} * )
+    description: |
+      The destroy handler is optional and may be ${/c/if/null:/name}.  If the
+      destroy handler is present, it is called from within the context of the
+      interrupt server to be deleted, see also ${server-delete:/name}.
+    kind: member
+    name: destroy
+  variants: []
+definition-kind: typedef-only
+description: null
+enabled-by: true
+index-entries: []
+interface-type: struct
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+name: rtems_interrupt_server_config
+notes: |
+  See also ${server-create:/name}.
+type: interface
diff --git a/spec/rtems/intr/if/server-control.yml b/spec/rtems/intr/if/server-control.yml
new file mode 100644
index 0000000..0489e84
--- /dev/null
+++ b/spec/rtems/intr/if/server-control.yml
@@ -0,0 +1,82 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  This structure represents an interrupt server.
+copyrights:
+- Copyright (C) 2020, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+- default: null
+  variants:
+  - definition:
+      brief: |
+        This member is the ISR lock protecting the server control state.
+      definition: ${lock:/name} ${.:name}
+      description: null
+      kind: member
+      name: lock
+    enabled-by: defined(RTEMS_SMP)
+- default:
+    brief: |
+      This member is the chain of pending interrupt entries.
+    definition: ${/score/chain/if/control:/name} ${.:name}
+    description: null
+    kind: member
+    name: entries
+  variants: []
+- default:
+    brief: |
+      This member is the identifier of the server task.
+    definition: ${../../type/if/id:/name} ${.:name}
+    description: null
+    kind: member
+    name: server
+  variants: []
+- default:
+    brief: |
+      This member is the error count.
+    definition: unsigned long ${.:name}
+    description: null
+    kind: member
+    name: errors
+  variants: []
+- default:
+    brief: |
+      This member is the server index.
+    definition: ${/c/if/uint32_t:/name} ${.:name}
+    description: null
+    kind: member
+    name: index
+  variants: []
+- default:
+    brief: |
+      This member is the node for the interrupt server registry.
+    definition: ${/score/chain/if/node:/name} ${.:name}
+    description: null
+    kind: member
+    name: node
+  variants: []
+- default:
+    brief: |
+      This member is the optional handler to destroy the interrupt server
+      control.
+    definition: void ( *${.:name} )( struct rtems_interrupt_server_control * )
+    description: null
+    kind: member
+    name: destroy
+  variants: []
+definition-kind: typedef-and-struct
+description: null
+enabled-by: true
+index-entries: []
+interface-type: struct
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+name: rtems_interrupt_server_control
+notes: |
+  This structure shall be treated as an opaque data type from the
+  ${/glossary/api:/term} point of view.  Members shall not be accessed
+  directly.  The structure is initialized by ${server-create:/name} and
+  maintained by the interrupt server support.
+type: interface
diff --git a/spec/rtems/intr/if/server-create.yml b/spec/rtems/intr/if/server-create.yml
new file mode 100644
index 0000000..162493b
--- /dev/null
+++ b/spec/rtems/intr/if/server-create.yml
@@ -0,0 +1,59 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Creates an interrupt server.
+copyrights:
+- Copyright (C) 2020, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${server-control:/name} *${.:/params[0]/name}
+    - const ${server-config:/name} *${.:/params[1]/name}
+    - ${/c/if/uint32_t:/name} *${.:/params[2]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/object-allocator
+name: rtems_interrupt_server_create
+notes: |
+  See also ${server-initialize:/name} and ${server-delete:/name}.
+params:
+- description: |
+    is the pointer to an ${server-control:/name} object.  When the directive
+    call was successful, the ownership of the object was transferred from the
+    caller of the directive to the interrupt server management.
+  dir: out
+  name: control
+- description: |
+    is the interrupt server configuration.
+  dir: null
+  name: config
+- description: |
+    is the pointer to an ${/c/if/uint32_t:/name} object.  When the directive
+    call was successful, the index of the created interrupt server will be
+    stored in this object.
+  dir: out
+  name: server_index
+return:
+  return: |
+    The directive uses ${../../task/if/create:/name}.  If this directive fails,
+    then its error status will be returned.
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+type: interface
diff --git a/spec/rtems/intr/if/server-default.yml b/spec/rtems/intr/if/server-default.yml
new file mode 100644
index 0000000..3738b58
--- /dev/null
+++ b/spec/rtems/intr/if/server-default.yml
@@ -0,0 +1,20 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  The constant represents the index of the default interrupt server.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default: '0'
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: define
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+name: RTEMS_INTERRUPT_SERVER_DEFAULT
+notes: null
+type: interface
diff --git a/spec/rtems/intr/if/server-delete.yml b/spec/rtems/intr/if/server-delete.yml
new file mode 100644
index 0000000..6a89210
--- /dev/null
+++ b/spec/rtems/intr/if/server-delete.yml
@@ -0,0 +1,51 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Deletes the interrupt server.
+copyrights:
+- Copyright (C) 2020, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${/c/if/uint32_t:/name} ${.:/params[0]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: ../constraint/not-within-server
+- role: constraint
+  uid: /constraint/request-response
+name: rtems_interrupt_server_delete
+notes: |
+  The interrupt server deletes itself, so after the return of the directive the
+  interrupt server may be still in the termination process depending on the
+  task priorities of the system.
+
+  See also ${server-create:/name}.
+params:
+- description: |
+    is the index of the interrupt server to delete.
+  dir: null
+  name: server_index
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      There was no interrupt server associated with the server index specified
+      by ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+type: interface
diff --git a/spec/rtems/intr/if/server-entry-destroy.yml b/spec/rtems/intr/if/server-entry-destroy.yml
new file mode 100644
index 0000000..e4fa67c
--- /dev/null
+++ b/spec/rtems/intr/if/server-entry-destroy.yml
@@ -0,0 +1,42 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Destroys the interrupt server entry.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${server-entry:/name} *${.:/params[0]/name}
+    return: void
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: ../constraint/not-within-server
+- role: constraint
+  uid: /constraint/request-response
+- role: constraint
+  uid: ../constraint/server-entry-initialized
+name: rtems_interrupt_server_entry_destroy
+notes: |
+  No error checking is performed by the directive.
+params:
+- description: |
+    is the interrupt server entry to destroy.
+  dir: inout
+  name: entry
+return:
+  return: null
+  return-values: []
+type: interface
diff --git a/spec/rtems/intr/if/server-entry-initialize.yml b/spec/rtems/intr/if/server-entry-initialize.yml
new file mode 100644
index 0000000..5e1b72d
--- /dev/null
+++ b/spec/rtems/intr/if/server-entry-initialize.yml
@@ -0,0 +1,58 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Initializes the interrupt server entry.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${/c/if/uint32_t:/name} ${.:/params[0]/name}
+    - ${server-entry:/name} *${.:/params[1]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/object-allocator
+name: rtems_interrupt_server_entry_initialize
+notes: |
+  After initialization, the list of actions of the interrupt server entry is
+  empty.  Actions may be prepended by ${server-action-prepend:/name}.
+  Interrupt server entries may be moved to another interrupt vector with
+  ${server-entry-move:/name}.  Server entries may be submitted to get serviced
+  by the interrupt server with ${server-entry-submit:/name}.  Server entries
+  may be destroyed by ${server-entry-destroy:/name}.
+params:
+- description: |
+    is the interrupt server index.  The constant ${server-default:/name} may be
+    used to specify the default interrupt server.
+  dir: null
+  name: server_index
+- description: |
+    is the interrupt server entry to initialize.
+  dir: null
+  name: entry
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      There was no interrupt server associated with the index specified by
+      ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+type: interface
diff --git a/spec/rtems/intr/if/server-entry-move.yml b/spec/rtems/intr/if/server-entry-move.yml
new file mode 100644
index 0000000..f9972da
--- /dev/null
+++ b/spec/rtems/intr/if/server-entry-move.yml
@@ -0,0 +1,63 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Moves the interrupt server entry to the interrupt server.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${server-entry:/name} *${.:/params[0]/name}
+    - ${/c/if/uint32_t:/name} ${.:/params[1]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/object-allocator
+- role: constraint
+  uid: ../constraint/server-entry-initialized
+- role: constraint
+  uid: ../constraint/server-entry-not-while-action-prepend
+- role: constraint
+  uid: ../constraint/server-entry-not-while-move
+- role: constraint
+  uid: ../constraint/server-entry-not-while-submit
+- role: constraint
+  uid: ../constraint/server-entry-not-while-pending
+name: rtems_interrupt_server_entry_move
+notes: null
+params:
+- description: |
+    is the interrupt server entry to move.
+  dir: null
+  name: entry
+- description: |
+    is the index of the destination interrupt server.  The constant
+    ${server-default:/name} may be used to specify the default interrupt
+    server.
+  dir: null
+  name: server_index
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      There was no interrupt server associated with the index specified by
+      ${.:/params[1]/name}.
+    value: ${../../status/if/invalid-id:/name}
+type: interface
diff --git a/spec/rtems/intr/if/server-entry-submit.yml b/spec/rtems/intr/if/server-entry-submit.yml
new file mode 100644
index 0000000..88b61f1
--- /dev/null
+++ b/spec/rtems/intr/if/server-entry-submit.yml
@@ -0,0 +1,58 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Submits the interrupt server entry to be serviced by the interrupt server.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${server-entry:/name} *${.:/params[0]/name}
+    return: void
+  variants: []
+description: |
+  The directive appends the entry to the pending entries of the interrupt
+  server.  The interrupt server is notified that a new entry is pending.  Once
+  the interrupt server is scheduled it services the actions of all pending
+  entries.
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-isr
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/unblock-may-preempt
+- role: constraint
+  uid: ../constraint/server-entry-initialized
+- role: constraint
+  uid: ../constraint/server-entry-not-while-action-prepend
+- role: constraint
+  uid: ../constraint/server-entry-not-while-move
+name: rtems_interrupt_server_entry_submit
+notes: |
+  This directive may be used to do a two-step interrupt processing.  The first
+  step is done from within interrupt context by a call to this directive.  The
+  second step is then done from within the context of the interrupt server.
+
+  No error checking is performed by the directive.
+
+  A submitted entry may be destroyed by ${server-entry-destroy:/name}.
+params:
+- description: |
+    is the interrupt server entry to submit.
+  dir: null
+  name: entry
+return:
+  return: null
+  return-values: []
+type: interface
diff --git a/spec/rtems/intr/if/server-entry.yml b/spec/rtems/intr/if/server-entry.yml
new file mode 100644
index 0000000..e997419
--- /dev/null
+++ b/spec/rtems/intr/if/server-entry.yml
@@ -0,0 +1,57 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  This structure represents an interrupt server entry.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+- default:
+    brief: |
+      This member is the node for the interrupt entry processing.
+    definition: ${/score/chain/if/node:/name} ${.:name}
+    description: null
+    kind: member
+    name: node
+  variants: []
+- default:
+    brief: |
+      This member references the interrupt server used to process the entry.
+    definition: ${server-control:/name} *${.:name}
+    description: null
+    kind: member
+    name: server
+  variants: []
+- default:
+    brief: |
+      This member is the interrupt vector number.
+    definition: ${vector-number:/name} ${.:name}
+    description: null
+    kind: member
+    name: vector
+  variants: []
+- default:
+    brief: |
+      This member is the interrupt server actions list head.
+    definition: ${server-action:/name} *${.:name}
+    description: null
+    kind: member
+    name: actions
+  variants: []
+definition-kind: typedef-only
+description: null
+enabled-by: true
+index-entries: []
+interface-type: struct
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+name: rtems_interrupt_server_entry
+notes: |
+  This structure shall be treated as an opaque data type from the
+  ${/glossary/api:/term} point of view.  Members shall not be accessed
+  directly.  An entry is initialized by ${server-entry-initialize:/name} and
+  destroyed by ${server-entry-destroy:/name}.  Interrupt server actions can be
+  prepended to the entry by ${server-action-prepend:/name}.  The entry is
+  submitted to be serviced by ${server-entry-submit:/name}.
+type: interface
diff --git a/spec/rtems/intr/if/server-handler-install.yml b/spec/rtems/intr/if/server-handler-install.yml
new file mode 100644
index 0000000..9085d97
--- /dev/null
+++ b/spec/rtems/intr/if/server-handler-install.yml
@@ -0,0 +1,106 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Installs the interrupt handler routine and argument at the interrupt vector
+  on the interrupt server.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${/c/if/uint32_t:/name} ${.:/params[0]/name}
+    - ${vector-number:/name} ${.:/params[1]/name}
+    - const char *${.:/params[2]/name}
+    - ${../../option/if/option:/name} ${.:/params[3]/name}
+    - ${handler:/name} ${.:/params[4]/name}
+    - void *${.:/params[5]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: |
+  The handler routine specified by ${.:/params[4]/name} will be executed within
+  the context of the interrupt server task specified by ${.:/params[0]/name}.
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/object-allocator
+name: rtems_interrupt_server_handler_install
+notes: |
+  See also ${handler-install:/name}.
+params:
+- description: |
+    is the interrupt server index.  The constant ${server-default:/name} may be
+    used to specify the default interrupt server.
+  dir: null
+  name: server_index
+- description: |
+    is the interrupt vector number.
+  dir: null
+  name: vector
+- description: |
+    is the descriptive information of the interrupt handler to install.
+  dir: null
+  name: info
+- description: |
+    is the interrupt handler install option set.
+  dir: null
+  name: options
+- description: |
+    is the interrupt handler routine to install.
+  dir: null
+  name: routine
+- description: |
+    is the interrupt handler argument to install.
+  dir: null
+  name: arg
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      There was no interrupt server associated with the index specified by
+      ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+  - description: |
+      The directive was called from within interrupt context.
+    value: ${../../status/if/called-from-isr:/name}
+  - description: |
+      The ${.:/params[4]/name} parameter was ${/c/if/null:/name}.
+    value: ${../../status/if/invalid-address:/name}
+  - description: |
+      There was no interrupt vector associated with the number specified by
+      ${.:/params[1]/name}.
+    value: ${../../status/if/invalid-id:/name}
+  - description: |
+      An option specified by ${.:/params[2]/name} was not applicable.
+    value: ${../../status/if/invalid-number:/name}
+  - description: |
+      The ${unique:/name} option was set in ${.:/params[2]/name} and the
+      interrupt vector was already occupied by a handler.
+    value: ${../../status/if/resource-in-use:/name}
+  - description: |
+      The ${shared:/name} option was set in ${.:/params[2]/name} and the
+      interrupt vector was already occupied by a unique handler.
+    value: ${../../status/if/resource-in-use:/name}
+  - description: |
+      The handler specified by ${.:/params[4]/name} was already installed for
+      the interrupt vector specified by ${.:/params[1]/name} with an argument
+      equal to the argument specified by ${.:/params[5]/name}.
+    value: ${../../status/if/too-many:/name}
+  - description: |
+      The ${replace:/name} option was set in ${.:/params[2]/name} and no
+      handler to replace was installed.
+    value: ${../../status/if/unsatisfied:/name}
+type: interface
diff --git a/spec/rtems/intr/if/server-handler-iterate.yml b/spec/rtems/intr/if/server-handler-iterate.yml
new file mode 100644
index 0000000..b092256
--- /dev/null
+++ b/spec/rtems/intr/if/server-handler-iterate.yml
@@ -0,0 +1,74 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Iterates over all interrupt handler installed at the interrupt vector and
+  interrupt server.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${/c/if/uint32_t:/name} ${.:/params[0]/name}
+    - ${vector-number:/name} ${.:/params[1]/name}
+    - ${per-handler-routine:/name} ${.:/params[2]/name}
+    - void *${.:/params[3]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: |
+  For each installed handler at the interrupt vector and interrupt server the
+  visitor function specified by ${.:/params[1]/name} will be called with the
+  argument specified by ${.:/params[2]/name} and the handler information,
+  options, routine and argument.
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/object-allocator
+name: rtems_interrupt_server_handler_iterate
+notes: |
+  The directive is intended for system information and diagnostics.
+ 
+  Never install or remove an interrupt handler within the visitor function.
+  This may result in a deadlock.
+params:
+- description: |
+    is the index of the interrupt server.
+  dir: null
+  name: server_index
+- description: |
+    is the interrupt vector number.
+  dir: null
+  name: vector
+- description: |
+    is the visitor routine.
+  dir: null
+  name: routine
+- description: |
+    is the visitor argument.
+  dir: null
+  name: arg
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      There was no interrupt server associated with the index specified by
+      ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+  - description: |
+      There was no interrupt vector associated with the number specified by
+      ${.:/params[1]/name}.
+    value: ${../../status/if/invalid-id:/name}
+type: interface
diff --git a/spec/rtems/intr/if/server-handler-remove.yml b/spec/rtems/intr/if/server-handler-remove.yml
new file mode 100644
index 0000000..6039650
--- /dev/null
+++ b/spec/rtems/intr/if/server-handler-remove.yml
@@ -0,0 +1,73 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Removes the interrupt handler routine and argument from the interrupt vector
+  and the interrupt server.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${/c/if/uint32_t:/name} ${.:/params[0]/name}
+    - ${vector-number:/name} ${.:/params[1]/name}
+    - ${handler:/name} ${.:/params[2]/name}
+    - void *${.:/params[3]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/object-allocator
+- role: constraint
+  uid: /constraint/request-response
+- role: constraint
+  uid: ../constraint/not-within-server
+name: rtems_interrupt_server_handler_remove
+notes: null
+params:
+- description: |
+    is the interrupt server index.  The constant ${server-default:/name} may be
+    used to specify the default interrupt server.
+  dir: null
+  name: server_index
+- description: |
+    is the interrupt vector number.
+  dir: null
+  name: vector
+- description: |
+    is the interrupt handler routine to remove.
+  dir: null
+  name: routine
+- description: |
+    is the interrupt handler argument to remove.
+  dir: null
+  name: arg
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      There was no interrupt server associated with the index specified by
+      ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+  - description: |
+      There was no interrupt vector associated with the number specified by
+      ${.:/params[1]/name}.
+    value: ${../../status/if/invalid-id:/name}
+  - description: |
+      There was no handler routine and argument pair installed specified by
+      ${.:/params[2]/name} and ${.:/params[3]/name}.
+    value: ${../../status/if/unsatisfied:/name}
+type: interface
diff --git a/spec/rtems/intr/if/server-initialize.yml b/spec/rtems/intr/if/server-initialize.yml
new file mode 100644
index 0000000..755e737
--- /dev/null
+++ b/spec/rtems/intr/if/server-initialize.yml
@@ -0,0 +1,86 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Initializes the interrupt server tasks.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${../../type/if/priority:/name} ${.:/params[0]/name}
+    - ${/c/if/size_t:/name} ${.:/params[1]/name}
+    - ${../../mode/if/mode:/name} ${.:/params[2]/name}
+    - ${../../attr/if/attribute:/name} ${.:/params[3]/name}
+    - ${/c/if/uint32_t:/name} *${.:/params[4]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: |
+  The directive tries to create an interrupt server task for each online
+  processor in the system.  The tasks will have the initial priority specified
+  by ${.:/params[0]/name}, the stack size specified by ${.:/params[1]/name},
+  the initial mode set specified by ${.:/params[2]/name}, and the attribute set
+  specified by ${.:/params[3]/name}.  The count of successfully created server
+  tasks will be returned in ${.:/params[4]/name} if the pointer is not equal to
+  ${/c/if/null:/name}.
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/object-allocator
+name: rtems_interrupt_server_initialize
+notes: |
+  Interrupt handlers may be installed on an interrupt server with
+  ${server-handler-install:/name} and removed with
+  ${server-handler-remove:/name} using a server index.  In case of an
+  interrupt, the request will be forwarded to the interrupt server.  The
+  handlers are executed within the interrupt server context.  If one handler
+  blocks on something this may delay the processing of other handlers.
+
+  Interrupt servers may be deleted by ${server-delete:/name}.
+params:
+- description: |
+    is the initial ${/glossary/priority-task:/term} of the created interrupt
+    servers.
+  dir: null
+  name: priority
+- description: |
+    is the task stack size of the created interrupt servers.
+  dir: null
+  name: stack_size
+- description: |
+    is the initial mode set of the created interrupt servers.
+  dir: null
+  name: modes
+- description: |
+    is the attribute set of the created interrupt servers.
+  dir: null
+  name: attributes
+- description: |
+    is the pointer to an ${/c/if/uint32_t:/name} object or ${/c/if/null:/name}.
+    When the pointer is not equal to ${/c/if/null:/name}, the count of
+    successfully created interrupt servers is stored in this object regardless
+    of the return status.
+  dir: out
+  name: server_count
+return:
+  return: |
+    The directive uses ${../../task/if/create:/name}.  If this directive fails,
+    then its error status will be returned.
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      The interrupt servers were already initialized.
+    value: ${../../status/if/incorrect-state:/name}
+type: interface
diff --git a/spec/rtems/intr/if/server-move.yml b/spec/rtems/intr/if/server-move.yml
new file mode 100644
index 0000000..b4e8e7a
--- /dev/null
+++ b/spec/rtems/intr/if/server-move.yml
@@ -0,0 +1,69 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Moves the interrupt handlers installed at the interrupt vector and the source
+  interrupt server to the destination interrupt server.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${/c/if/uint32_t:/name} ${.:/params[0]/name}
+    - ${vector-number:/name} ${.:/params[1]/name}
+    - ${/c/if/uint32_t:/name} ${.:/params[2]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: ../constraint/not-within-server
+- role: constraint
+  uid: /constraint/request-response
+name: rtems_interrupt_server_move
+notes: null
+params:
+- description: |
+    is the index of the source interrupt server.  The constant
+    ${server-default:/name} may be used to specify the default interrupt
+    server.
+  dir: null
+  name: source_server_index
+- description: |
+    is the interrupt vector number.
+  dir: null
+  name: vector
+- description: |
+    is the index of the destination interrupt server.  The constant
+    ${server-default:/name} may be used to specify the default interrupt
+    server.
+  dir: null
+  name: destination_server_index
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      There was no interrupt server associated with the index specified by
+      ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+  - description: |
+      There was no interrupt server associated with the index specified by
+      ${.:/params[2]/name}.
+    value: ${../../status/if/invalid-id:/name}
+  - description: |
+      There was no interrupt vector associated with the number specified by
+      ${.:/params[1]/name}.
+    value: ${../../status/if/invalid-id:/name}
+type: interface
diff --git a/spec/rtems/intr/if/server-request-destroy.yml b/spec/rtems/intr/if/server-request-destroy.yml
new file mode 100644
index 0000000..800d8e8
--- /dev/null
+++ b/spec/rtems/intr/if/server-request-destroy.yml
@@ -0,0 +1,43 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Destroys the interrupt server request.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: |
+      ${server-entry-destroy:/name}( &${.:/params[0]/name}->entry );
+    params:
+    - ${server-request:/name} *${.:/params[0]/name}
+    return: void
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: ../constraint/not-within-server
+- role: constraint
+  uid: /constraint/request-response
+- role: constraint
+  uid: ../constraint/server-request-initialized
+name: rtems_interrupt_server_request_destroy
+notes: |
+  No error checking is performed by the directive.
+params:
+- description: |
+    is the interrupt server request to destroy.
+  dir: inout
+  name: request
+return:
+  return: null
+  return-values: []
+type: interface
diff --git a/spec/rtems/intr/if/server-request-initialize.yml b/spec/rtems/intr/if/server-request-initialize.yml
new file mode 100644
index 0000000..5f8b937
--- /dev/null
+++ b/spec/rtems/intr/if/server-request-initialize.yml
@@ -0,0 +1,68 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Initializes the interrupt server request.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${/c/if/uint32_t:/name} ${.:/params[0]/name}
+    - ${server-request:/name} *${.:/params[1]/name}
+    - ${handler:/name} ${.:/params[2]/name}
+    - void *${.:/params[3]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/object-allocator
+name: rtems_interrupt_server_request_initialize
+notes: |
+  An interrupt server requests consists of an interrupt server entry and
+  exactly one interrupt server action.  The interrupt vector of the request may
+  be changed with ${server-request-set-vector:/name}.  Interrupt server
+  requests may be submitted to get serviced by the interrupt server with
+  ${server-request-submit:/name}.  Requests may be destroyed by
+  ${server-request-destroy:/name}.
+params:
+- description: |
+    is the interrupt server index.  The constant ${server-default:/name} may be
+    used to specify the default interrupt server.
+  dir: null
+  name: server_index
+- description: |
+    is the interrupt server request to initialize.
+  dir: out
+  name: request
+- description: |
+    is the interrupt handler routine for the request action.
+  dir: null
+  name: routine
+- description: |
+    is the interrupt handler argument for the request action.
+  dir: null
+  name: arg
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      There was no interrupt server associated with the index specified by
+      ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+type: interface
diff --git a/spec/rtems/intr/if/server-request-set-vector.yml b/spec/rtems/intr/if/server-request-set-vector.yml
new file mode 100644
index 0000000..c6c6465
--- /dev/null
+++ b/spec/rtems/intr/if/server-request-set-vector.yml
@@ -0,0 +1,62 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Sets the interrupt vector in the interrupt server request.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: |
+      ${.:/params[0]/name}->entry.vector = vector;
+    params:
+    - ${server-request:/name} *${.:/params[0]/name}
+    - ${vector-number:/name} ${.:/params[1]/name}
+    return: void
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-isr
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/directive-no-preempt
+- role: constraint
+  uid: ../constraint/server-request-initialized
+- role: constraint
+  uid: ../constraint/server-request-not-while-set-vector
+- role: constraint
+  uid: ../constraint/server-request-not-while-submit
+- role: constraint
+  uid: ../constraint/server-entry-not-while-pending
+name: rtems_interrupt_server_request_set_vector
+notes: |
+  By default, the interrupt vector of an interrupt server request is set to a
+  special value which is outside the range of vectors supported by the
+  interrupt controller hardware.
+
+  Calls to ${server-request-submit:/name} will disable the interrupt vector of
+  the request.  After processing of the request by the interrupt server the
+  interrupt vector will be enabled again.
+params:
+- description: |
+    is the interrupt server request to change.
+  dir: inout
+  name: request
+- description: |
+    is the interrupt vector number to be used by the request.
+  dir: null
+  name: vector
+return:
+  return: null
+  return-values: []
+type: interface
diff --git a/spec/rtems/intr/if/server-request-submit.yml b/spec/rtems/intr/if/server-request-submit.yml
new file mode 100644
index 0000000..aa526f0
--- /dev/null
+++ b/spec/rtems/intr/if/server-request-submit.yml
@@ -0,0 +1,57 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Submits the interrupt server request to be serviced by the interrupt server.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: |
+      ${server-entry-submit:/name}( &${.:/params[0]/name}->entry );
+    params:
+    - ${server-request:/name} *${.:/params[0]/name}
+    return: void
+  variants: []
+description: |
+  The directive appends the interrupt server entry of the request to the
+  pending entries of the interrupt server.  The interrupt server is notified
+  that a new entry is pending.  Once the interrupt server is scheduled it
+  services the actions of all pending entries.
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-isr
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/unblock-may-preempt
+- role: constraint
+  uid: ../constraint/server-request-initialized
+- role: constraint
+  uid: ../constraint/server-request-not-while-set-vector
+name: rtems_interrupt_server_request_submit
+notes: |
+  This directive may be used to do a two-step interrupt processing.  The first
+  step is done from within interrupt context by a call to this directive.  The
+  second step is then done from within the context of the interrupt server.
+
+  No error checking is performed by the directive.
+
+  A submitted request may be destroyed by ${server-request-destroy:/name}.
+params:
+- description: |
+    is the interrupt server request to submit.
+  dir: inout
+  name: request
+return:
+  return: null
+  return-values: []
+type: interface
diff --git a/spec/rtems/intr/if/server-request.yml b/spec/rtems/intr/if/server-request.yml
new file mode 100644
index 0000000..a6f8bea
--- /dev/null
+++ b/spec/rtems/intr/if/server-request.yml
@@ -0,0 +1,41 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  This structure represents an interrupt server request.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+- default:
+    brief: |
+      This member is the interrupt server entry.
+    definition: ${server-entry:/name} ${.:name}
+    description: null
+    kind: member
+    name: entry
+  variants: []
+- default:
+    brief: |
+      This member is the interrupt server action.
+    definition: ${server-action:/name} ${.:name}
+    description: null
+    kind: member
+    name: action
+  variants: []
+definition-kind: typedef-only
+description: null
+enabled-by: true
+index-entries: []
+interface-type: struct
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+name: rtems_interrupt_server_request
+notes: |
+  This structure shall be treated as an opaque data type from the
+  ${/glossary/api:/term} point of view.  Members shall not be accessed
+  directly.  A request is initialized by ${server-request-initialize:/name} and
+  destroyed by ${server-request-destroy:/name}.  The interrupt vector of the
+  request can be set by ${server-request-set-vector:/name}.  The request is
+  submitted to be serviced by ${server-request-submit:/name}.
+type: interface
diff --git a/spec/rtems/intr/if/server-resume.yml b/spec/rtems/intr/if/server-resume.yml
new file mode 100644
index 0000000..f7357dc
--- /dev/null
+++ b/spec/rtems/intr/if/server-resume.yml
@@ -0,0 +1,49 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Resumes the interrupt server.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${/c/if/uint32_t:/name} ${.:/params[0]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: ../constraint/not-within-server
+- role: constraint
+  uid: /constraint/request-response
+name: rtems_interrupt_server_resume
+notes: |
+  Interrupt server may be suspended by ${server-suspend:/name}.
+params:
+- description: |
+    is the index of the interrupt server to resume.  The constant
+    ${server-default:/name} may be used to specify the default interrupt
+    server.
+  dir: null
+  name: server_index
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      There was no interrupt server associated with the index specified by
+      ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+type: interface
diff --git a/spec/rtems/intr/if/server-set-affinity.yml b/spec/rtems/intr/if/server-set-affinity.yml
new file mode 100644
index 0000000..e9e3da7
--- /dev/null
+++ b/spec/rtems/intr/if/server-set-affinity.yml
@@ -0,0 +1,79 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Sets the processor affinity of the interrupt server.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${/c/if/uint32_t:/name} ${.:/params[0]/name}
+    - ${/c/if/size_t:/name} ${.:/params[1]/name}
+    - const ${/c/if/cpu_set_t:/name} *${.:/params[2]/name}
+    - ${../../type/if/priority:/name} ${.:/params[3]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-isr
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/affinity-may-preempt
+- role: constraint
+  uid: /constraint/priority-may-preempt
+name: rtems_interrupt_server_set_affinity
+notes: |
+  The scheduler is set determined by the highest numbered processor in the
+  affinity set specified by ${.:/params[2]/name}.
+
+  This operation is only reliable in case the interrupt server was suspended
+  via ${server-suspend:/name}.
+params:
+- description: |
+    is the interrupt server index.  The constant ${server-default:/name} may be
+    used to specify the default interrupt server.
+  dir: null
+  name: server_index
+- description: |
+    is the size of the processor set referenced by ${.:/params[2]/name} in
+    bytes.
+  dir: null
+  name: affinity_size
+- description: |
+    is the pointer to a ${/c/if/cpu_set_t:/name} object.  The processor set
+    defines the new processor affinity set of the interrupt server.  A set bit
+    in the processor set means that the corresponding processor shall be in the
+    processor affinity set of the task, otherwise the bit shall be cleared.
+  dir: null
+  name: affinity
+- description: |
+    is the new ${/glossary/priority-real:/term} for the interrupt server.
+  dir: null
+  name: priority
+return:
+  return: |
+    The directive uses ${../../scheduler/if/ident-by-processor-set:/name},
+    ${../../task/if/set-scheduler:/name}, and
+    ${../../task/if/set-affinity:/name}.  If one of these directive fails, then
+    its error status will be returned.
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      There was no interrupt server associated with the index specified by
+      ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+type: interface
diff --git a/spec/rtems/intr/if/server-suspend.yml b/spec/rtems/intr/if/server-suspend.yml
new file mode 100644
index 0000000..68b43ad
--- /dev/null
+++ b/spec/rtems/intr/if/server-suspend.yml
@@ -0,0 +1,49 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Suspends the interrupt server.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${/c/if/uint32_t:/name} ${.:/params[0]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: ../constraint/not-within-server
+- role: constraint
+  uid: /constraint/request-response
+name: rtems_interrupt_server_suspend
+notes: |
+  Interrupt server may be resumed by ${server-resume:/name}.
+params:
+- description: |
+    is the index of the interrupt server to suspend.  The constant
+    ${server-default:/name} may be used to specify the default interrupt
+    server.
+  dir: null
+  name: server_index
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      There was no interrupt server associated with the index specified by
+      ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+type: interface
diff --git a/spec/rtems/intr/if/set-affinity.yml b/spec/rtems/intr/if/set-affinity.yml
new file mode 100644
index 0000000..5a63a12
--- /dev/null
+++ b/spec/rtems/intr/if/set-affinity.yml
@@ -0,0 +1,76 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  Sets the processor affinity set of the interrupt vector.
+copyrights:
+- Copyright (C) 2017, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default:
+    attributes: null
+    body: null
+    params:
+    - ${vector-number:/name} ${.:/params[0]/name}
+    - ${/c/if/size_t:/name} ${.:/params[1]/name}
+    - const ${/c/if/cpu_set_t:/name} *${.:/params[2]/name}
+    return: ${../../status/if/code:/name}
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+- role: constraint
+  uid: /constraint/directive-ctx-isr
+- role: constraint
+  uid: /constraint/directive-ctx-devinit
+- role: constraint
+  uid: /constraint/directive-ctx-task
+- role: constraint
+  uid: /constraint/directive-no-preempt
+name: rtems_interrupt_set_affinity
+notes: |
+  The ${get-attributes:/name} directive may be used to check if the processor
+  affinity of an interrupt vector can be set.
+params:
+- description: |
+    is the interrupt vector number.
+  dir: null
+  name: vector
+- description: |
+    is the size of the processor set referenced by ${.:/params[2]/name} in
+    bytes.
+  dir: null
+  name: affinity_size
+- description: |
+    is the pointer to a ${/c/if/cpu_set_t:/name} object.  The processor set
+    defines the new processor affinity set of the interrupt vector.  A set bit
+    in the processor set means that the corresponding processor shall be in the
+    processor affinity set of the interrupt vector, otherwise the bit shall be
+    cleared.
+  dir: null
+  name: affinity
+return:
+  return: null
+  return-values:
+  - description: |
+      The requested operation was successful.
+    value: ${../../status/if/successful:/name}
+  - description: |
+      The ${.:/params[2]/name} parameter was ${/c/if/null:/name}.
+    value: ${../../status/if/invalid-address:/name}
+  - description: |
+      There was no interrupt vector associated with the number specified by
+      ${.:/params[0]/name}.
+    value: ${../../status/if/invalid-id:/name}
+  - description: |
+      The referenced processor set was not a valid new processor affinity set
+      for the interrupt vector.
+    value: ${../../status/if/invalid-number:/name}
+  - description: |
+      The request to set the processor affinity of the interrupt vector has not
+      been satisfied.
+    value: ${../../status/if/unsatisfied:/name}
+type: interface
diff --git a/spec/rtems/intr/if/shared.yml b/spec/rtems/intr/if/shared.yml
new file mode 100644
index 0000000..a756877
--- /dev/null
+++ b/spec/rtems/intr/if/shared.yml
@@ -0,0 +1,21 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  This interrupt handler install option allows that the interrupt handler may
+  share the interrupt vector with other handler.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default: ( (${../../option/if/option:/name}) 0x00000000 )
+  variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: define
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+name: RTEMS_INTERRUPT_SHARED
+notes: null
+type: interface
diff --git a/spec/rtems/intr/if/unique.yml b/spec/rtems/intr/if/unique.yml
new file mode 100644
index 0000000..a1cb389
--- /dev/null
+++ b/spec/rtems/intr/if/unique.yml
@@ -0,0 +1,22 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  This interrupt handler install option ensures that the interrupt handler is
+  unique.
+copyrights:
+- Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+definition:
+  default: ( (${../../option/if/option:/name}) 0x00000001 )
+  variants: []
+description: |
+  This option prevents other handler from using the same interrupt vector.
+enabled-by: true
+index-entries: []
+interface-type: define
+links:
+- role: interface-placement
+  uid: header-2
+- role: interface-ingroup
+  uid: group
+name: RTEMS_INTERRUPT_UNIQUE
+notes: null
+type: interface
diff --git a/spec/score/chain/if/control.yml b/spec/score/chain/if/control.yml
new file mode 100644
index 0000000..5af06a0
--- /dev/null
+++ b/spec/score/chain/if/control.yml
@@ -0,0 +1,12 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+index-entries: []
+interface-type: unspecified-type
+links:
+- role: interface-placement
+  uid: header
+name: Chain_Control
+references: {}
+type: interface
diff --git a/spec/score/chain/if/header.yml b/spec/score/chain/if/header.yml
new file mode 100644
index 0000000..44683d0
--- /dev/null
+++ b/spec/score/chain/if/header.yml
@@ -0,0 +1,14 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+  This header file defines data structures of the Chain Handler.
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+index-entries: []
+interface-type: header-file
+links:
+- role: interface-placement
+  uid: ../../if/domain
+path: rtems/score/chain.h
+prefix: cpukit/include
+type: interface
diff --git a/spec/score/chain/if/node.yml b/spec/score/chain/if/node.yml
new file mode 100644
index 0000000..99c4c7f
--- /dev/null
+++ b/spec/score/chain/if/node.yml
@@ -0,0 +1,12 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+index-entries: []
+interface-type: unspecified-type
+links:
+- role: interface-placement
+  uid: header
+name: Chain_Node
+references: {}
+type: interface



More information about the vc mailing list