blob: 7bb73a769d28319b879f41ec281d64768389005a [file] [log] [blame]
====================================
Starting and stopping secondary CPUs
====================================
In this context, each thread is a CPU. That is, you start and stop threads of
CPUs.
.. _OPAL_START_CPU:
OPAL_START_CPU
==============
.. code-block:: c
#define OPAL_START_CPU 41
int64_t opal_start_cpu_thread(uint64_t server_no, uint64_t start_address);
Returns
-------
:ref:`OPAL_SUCCESS`
The CPU was instructed to start executing instructions from the specified
`start_address`.
This is an *asynchronous* operation, so it may take a short period of
time before the CPU actually starts at that address.
:ref:`OPAL_PARAMETER`
Invalid CPU.
:ref:`OPAL_WRONG_STATE`
If the CPU thread is not in OPAL, or is being re-initialized through :ref:`OPAL_REINIT_CPUS`
:ref:`OPAL_INTERNAL_ERROR`
Something else went horribly wrong.
.. _OPAL_RETURN_CPU:
OPAL_RETURN_CPU
===============
.. code-block:: c
#define OPAL_RETURN_CPU 69
int64_t opal_return_cpu(void);
When OPAL first starts the host, all secondary CPUs are spinning in OPAL.
To start them, one must call OPAL_START_CPU (you may want to OPAL_REINIT_CPUS
to set the HILE bit first).
In cases where you need OPAL to do something for you across all CPUs, such
as OPAL_REINIT_CPUS, (on some platforms) a firmware update or get the machine
back into a similar state as to when the host OS was started (e.g. for kexec)
you may also need to return control of the CPU to OPAL.
Returns
-------
This call does **not return**. You need to OPAL_START_CPU.