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
9#include <config.h>
10#include <mode/smp/smp.h>
11#include <model/smp.h>
12
13#ifdef ENABLE_SMP_SUPPORT
14static inline cpu_id_t cpuIndexToID(word_t index)
15{
16    return BIT(index);
17}
18
19static inline bool_t try_arch_atomic_exchange_rlx(void *ptr, void *new_val, void **prev)
20{
21    uint32_t atomic_status;
22    void *temp;
23
24    asm volatile(
25        LD_EX "%[prev_output], [%[ptr_val]]             \n\t" /* ret = *ptr */
26        ST_EX "%" OP_WIDTH "[atomic_var], %[new_val] , [%[ptr_val]] \n\t"  /* *ptr = new */
27        : [atomic_var] "=&r"(atomic_status), [prev_output]"=&r"(temp)     /* output */
28        : [ptr_val] "r"(ptr), [new_val] "r"(new_val)   /* input */
29        :
30    );
31
32    *prev = temp;
33
34    /* On ARM if an atomic operation succeeds, it returns 0 */
35    return (atomic_status == 0);
36}
37
38#endif /* ENABLE_SMP_SUPPORT */
39
40