17c2aad20Sopenharmony_ci/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ 27c2aad20Sopenharmony_ci 37c2aad20Sopenharmony_ci#ifndef __LINUX_COMPILER_H 47c2aad20Sopenharmony_ci#define __LINUX_COMPILER_H 57c2aad20Sopenharmony_ci 67c2aad20Sopenharmony_ci#define likely(x) __builtin_expect(!!(x), 1) 77c2aad20Sopenharmony_ci#define unlikely(x) __builtin_expect(!!(x), 0) 87c2aad20Sopenharmony_ci 97c2aad20Sopenharmony_ci#define READ_ONCE(x) (*(volatile typeof(x) *)&x) 107c2aad20Sopenharmony_ci#define WRITE_ONCE(x, v) (*(volatile typeof(x) *)&x) = (v) 117c2aad20Sopenharmony_ci 127c2aad20Sopenharmony_ci#define barrier() asm volatile("" ::: "memory") 137c2aad20Sopenharmony_ci 147c2aad20Sopenharmony_ci#if defined(__x86_64__) 157c2aad20Sopenharmony_ci 167c2aad20Sopenharmony_ci# define smp_rmb() barrier() 177c2aad20Sopenharmony_ci# define smp_wmb() barrier() 187c2aad20Sopenharmony_ci# define smp_mb() asm volatile("lock; addl $0,-132(%%rsp)" ::: "memory", "cc") 197c2aad20Sopenharmony_ci 207c2aad20Sopenharmony_ci# define smp_store_release(p, v) \ 217c2aad20Sopenharmony_cido { \ 227c2aad20Sopenharmony_ci barrier(); \ 237c2aad20Sopenharmony_ci WRITE_ONCE(*p, v); \ 247c2aad20Sopenharmony_ci} while (0) 257c2aad20Sopenharmony_ci 267c2aad20Sopenharmony_ci# define smp_load_acquire(p) \ 277c2aad20Sopenharmony_ci({ \ 287c2aad20Sopenharmony_ci typeof(*p) ___p = READ_ONCE(*p); \ 297c2aad20Sopenharmony_ci barrier(); \ 307c2aad20Sopenharmony_ci ___p; \ 317c2aad20Sopenharmony_ci}) 327c2aad20Sopenharmony_ci 337c2aad20Sopenharmony_ci#elif defined(__aarch64__) 347c2aad20Sopenharmony_ci 357c2aad20Sopenharmony_ci# define smp_rmb() asm volatile("dmb ishld" ::: "memory") 367c2aad20Sopenharmony_ci# define smp_wmb() asm volatile("dmb ishst" ::: "memory") 377c2aad20Sopenharmony_ci# define smp_mb() asm volatile("dmb ish" ::: "memory") 387c2aad20Sopenharmony_ci 397c2aad20Sopenharmony_ci#endif 407c2aad20Sopenharmony_ci 417c2aad20Sopenharmony_ci#ifndef smp_mb 427c2aad20Sopenharmony_ci# define smp_mb() __sync_synchronize() 437c2aad20Sopenharmony_ci#endif 447c2aad20Sopenharmony_ci 457c2aad20Sopenharmony_ci#ifndef smp_rmb 467c2aad20Sopenharmony_ci# define smp_rmb() smp_mb() 477c2aad20Sopenharmony_ci#endif 487c2aad20Sopenharmony_ci 497c2aad20Sopenharmony_ci#ifndef smp_wmb 507c2aad20Sopenharmony_ci# define smp_wmb() smp_mb() 517c2aad20Sopenharmony_ci#endif 527c2aad20Sopenharmony_ci 537c2aad20Sopenharmony_ci#ifndef smp_store_release 547c2aad20Sopenharmony_ci# define smp_store_release(p, v) \ 557c2aad20Sopenharmony_cido { \ 567c2aad20Sopenharmony_ci smp_mb(); \ 577c2aad20Sopenharmony_ci WRITE_ONCE(*p, v); \ 587c2aad20Sopenharmony_ci} while (0) 597c2aad20Sopenharmony_ci#endif 607c2aad20Sopenharmony_ci 617c2aad20Sopenharmony_ci#ifndef smp_load_acquire 627c2aad20Sopenharmony_ci# define smp_load_acquire(p) \ 637c2aad20Sopenharmony_ci({ \ 647c2aad20Sopenharmony_ci typeof(*p) ___p = READ_ONCE(*p); \ 657c2aad20Sopenharmony_ci smp_mb(); \ 667c2aad20Sopenharmony_ci ___p; \ 677c2aad20Sopenharmony_ci}) 687c2aad20Sopenharmony_ci#endif 697c2aad20Sopenharmony_ci 707c2aad20Sopenharmony_ci#endif /* __LINUX_COMPILER_H */ 71