[processor-sdk/open-amp.git] / lib / include / openamp / system / generic / machine / zynqmp_r5 / machine_system.h
1 /*
2 * Copyright (c) 2014, Mentor Graphics Corporation
3 * All rights reserved.
4 * Copyright (c) 2015 Xilinx, Inc. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * 3. Neither the name of the <ORGANIZATION> nor the names of its contributors
15 * may be used to endorse or promote products derived from this software
16 * without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
31 #ifndef _MACHINE_SYSTEM_H
32 #define _MACHINE_SYSTEM_H
34 /* Memory barrier */
35 #if (defined(__CC_ARM))
36 #define MEM_BARRIER() __schedule_barrier()
37 #elif (defined(__GNUC__))
38 #define MEM_BARRIER() asm volatile("dsb" : : : "memory")
39 #else
40 #define MEM_BARRIER()
41 #endif
43 static inline unsigned int xchg(void* plock, unsigned int lockVal)
44 {
45 volatile unsigned int tmpVal = 0;
46 volatile unsigned int tmpVal1 = 0;
48 #ifdef __GNUC__
50 asm (
51 "1: \n\t"
52 "LDREX %[tmpVal], [%[plock]] \n\t"
53 "STREX %[tmpVal1], %[lockVal], [%[plock]] \n\t"
54 "CMP %[tmpVal1], #0 \n\t"
55 "BNE 1b \n\t"
56 "DMB \n\t"
57 : [tmpVal] "=&r"(tmpVal)
58 : [tmpVal1] "r" (tmpVal1), [lockVal] "r"(lockVal), [plock] "r"(plock)
59 : "cc", "memory"
60 );
62 #endif
64 return tmpVal;
65 }
67 #endif /* _MACHINE_SYSTEM_H */