| ==================================== |
| 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. |