1/*
2 * Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7#pragma once
8#include <config.h>
9
10#ifdef ENABLE_SMP_SUPPORT
11
12#define LD_EX               "ldrex "
13#define ST_EX               "strex "
14#define OP_WIDTH
15
16extern char kernel_stack_alloc[CONFIG_MAX_NUM_NODES][BIT(CONFIG_KERNEL_STACK_BITS)];
17
18/* Get current stack pointer */
19static inline word_t getCurSP(void)
20{
21    word_t stack_address;
22    asm("mov %[stack_address], %[currStackAddress]" : [stack_address] "=r"(stack_address) : [currStackAddress] "r"(&stack_address):);
23    return stack_address;
24}
25
26static inline CONST cpu_id_t getCurrentCPUIndex(void)
27{
28    cpu_id_t cpu_id;
29    word_t sp = getCurSP();
30
31    sp -= (word_t) kernel_stack_alloc;
32    cpu_id = sp >> CONFIG_KERNEL_STACK_BITS;
33    return cpu_id;
34}
35
36#endif /* ENABLE_SMP_SUPPORT */
37
38