genode/repos/base-hw/src/include/hw/spec/arm/psci_call.h
Piotr Tworek dad1de1865 hw: Add interface for making basic ARM PSCI calls.
So far this only exposes two functions allowing the code to turn on
additional CPUs. There is much more functionality defined by PSCI spec
but so far its not needed by Genode.

Fixes #3672
2020-04-17 12:39:32 +02:00

43 lines
1.1 KiB
C++

/**
* \brief PSCI call macro for arm_v7
* \author Piotr Tworek
* \date 2019-11-27
*/
/*
* Copyright (C) 2019 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _SRC__INCLUDE__HW__SPEC__ARM__PSCI_CALL_H_
#define _SRC__INCLUDE__HW__SPEC__ARM__PSCI_CALL_H_
#include <hw/spec/arm/psci.h>
#define PSCI_CALL_IMPL(instr) \
static inline int call(unsigned int func, unsigned long a0, \
unsigned int a1, unsigned int a2) { \
unsigned long result = 0; \
asm volatile ("mov r0, %1 \n" \
"mov r1, %2 \n" \
"mov r2, %3 \n" \
"mov r3, %4 \n" \
#instr " #0 \n" \
"mov %0, r0 \n" \
: "=r"(result) \
: "r"(func), "r"(a0), "r"(a1), "r"(a2) \
: "r0", "r1", "r2", "r3"); \
return result; \
}
namespace Hw {
struct Psci_hvc_functor { PSCI_CALL_IMPL(hvc); };
struct Psci_smc_functor { PSCI_CALL_IMPL(smc); };
}
#undef PSCI_CALL_IMPL
#endif /* _SRC__INCLUDE__HW__SPEC__ARM__PSCI_CALL_H_ */