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

#define OPAL_START_CPU                               41

int64_t opal_start_cpu_thread(uint64_t server_no, uint64_t start_address);

Returns

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.
OPAL_PARAMETER
Invalid CPU.
OPAL_WRONG_STATE
If the CPU thread is not in OPAL, or is being re-initialized through OPAL_REINIT_CPUS
OPAL_INTERNAL_ERROR
Something else went horribly wrong.

OPAL_RETURN_CPU

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