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