1*4882a593Smuzhiyun#!/bin/sh 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun 4*4882a593SmuzhiyunATOMICDIR=$(dirname $0) 5*4882a593SmuzhiyunARCH=$2 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun. ${ATOMICDIR}/atomic-tbl.sh 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun#gen_template_fallback(template, meta, pfx, name, sfx, order, arch, atomic, int, args...) 10*4882a593Smuzhiyungen_template_fallback() 11*4882a593Smuzhiyun{ 12*4882a593Smuzhiyun local template="$1"; shift 13*4882a593Smuzhiyun local meta="$1"; shift 14*4882a593Smuzhiyun local pfx="$1"; shift 15*4882a593Smuzhiyun local name="$1"; shift 16*4882a593Smuzhiyun local sfx="$1"; shift 17*4882a593Smuzhiyun local order="$1"; shift 18*4882a593Smuzhiyun local arch="$1"; shift 19*4882a593Smuzhiyun local atomic="$1"; shift 20*4882a593Smuzhiyun local int="$1"; shift 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun local atomicname="${arch}${atomic}_${pfx}${name}${sfx}${order}" 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun local ret="$(gen_ret_type "${meta}" "${int}")" 25*4882a593Smuzhiyun local retstmt="$(gen_ret_stmt "${meta}")" 26*4882a593Smuzhiyun local params="$(gen_params "${int}" "${atomic}" "$@")" 27*4882a593Smuzhiyun local args="$(gen_args "$@")" 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun if [ ! -z "${template}" ]; then 30*4882a593Smuzhiyun printf "#ifndef ${atomicname}\n" 31*4882a593Smuzhiyun . ${template} 32*4882a593Smuzhiyun printf "#define ${atomicname} ${atomicname}\n" 33*4882a593Smuzhiyun printf "#endif\n\n" 34*4882a593Smuzhiyun fi 35*4882a593Smuzhiyun} 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun#gen_proto_fallback(meta, pfx, name, sfx, order, arch, atomic, int, args...) 38*4882a593Smuzhiyungen_proto_fallback() 39*4882a593Smuzhiyun{ 40*4882a593Smuzhiyun local meta="$1"; shift 41*4882a593Smuzhiyun local pfx="$1"; shift 42*4882a593Smuzhiyun local name="$1"; shift 43*4882a593Smuzhiyun local sfx="$1"; shift 44*4882a593Smuzhiyun local order="$1"; shift 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun local tmpl="$(find_fallback_template "${pfx}" "${name}" "${sfx}" "${order}")" 47*4882a593Smuzhiyun gen_template_fallback "${tmpl}" "${meta}" "${pfx}" "${name}" "${sfx}" "${order}" "$@" 48*4882a593Smuzhiyun} 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun#gen_basic_fallbacks(basename) 51*4882a593Smuzhiyungen_basic_fallbacks() 52*4882a593Smuzhiyun{ 53*4882a593Smuzhiyun local basename="$1"; shift 54*4882a593Smuzhiyuncat << EOF 55*4882a593Smuzhiyun#define ${basename}_acquire ${basename} 56*4882a593Smuzhiyun#define ${basename}_release ${basename} 57*4882a593Smuzhiyun#define ${basename}_relaxed ${basename} 58*4882a593SmuzhiyunEOF 59*4882a593Smuzhiyun} 60*4882a593Smuzhiyun 61*4882a593Smuzhiyungen_proto_order_variant() 62*4882a593Smuzhiyun{ 63*4882a593Smuzhiyun local meta="$1"; shift 64*4882a593Smuzhiyun local pfx="$1"; shift 65*4882a593Smuzhiyun local name="$1"; shift 66*4882a593Smuzhiyun local sfx="$1"; shift 67*4882a593Smuzhiyun local order="$1"; shift 68*4882a593Smuzhiyun local arch="$1" 69*4882a593Smuzhiyun local atomic="$2" 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun local basename="${arch}${atomic}_${pfx}${name}${sfx}" 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun printf "#define arch_${basename}${order} ${basename}${order}\n" 74*4882a593Smuzhiyun} 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun#gen_proto_order_variants(meta, pfx, name, sfx, arch, atomic, int, args...) 77*4882a593Smuzhiyungen_proto_order_variants() 78*4882a593Smuzhiyun{ 79*4882a593Smuzhiyun local meta="$1"; shift 80*4882a593Smuzhiyun local pfx="$1"; shift 81*4882a593Smuzhiyun local name="$1"; shift 82*4882a593Smuzhiyun local sfx="$1"; shift 83*4882a593Smuzhiyun local arch="$1" 84*4882a593Smuzhiyun local atomic="$2" 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun local basename="${arch}${atomic}_${pfx}${name}${sfx}" 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun local template="$(find_fallback_template "${pfx}" "${name}" "${sfx}" "${order}")" 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun if [ -z "$arch" ]; then 91*4882a593Smuzhiyun gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@" 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun if meta_has_acquire "${meta}"; then 94*4882a593Smuzhiyun gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@" 95*4882a593Smuzhiyun fi 96*4882a593Smuzhiyun if meta_has_release "${meta}"; then 97*4882a593Smuzhiyun gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@" 98*4882a593Smuzhiyun fi 99*4882a593Smuzhiyun if meta_has_relaxed "${meta}"; then 100*4882a593Smuzhiyun gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_relaxed" "$@" 101*4882a593Smuzhiyun fi 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun echo "" 104*4882a593Smuzhiyun fi 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun # If we don't have relaxed atomics, then we don't bother with ordering fallbacks 107*4882a593Smuzhiyun # read_acquire and set_release need to be templated, though 108*4882a593Smuzhiyun if ! meta_has_relaxed "${meta}"; then 109*4882a593Smuzhiyun gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@" 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun if meta_has_acquire "${meta}"; then 112*4882a593Smuzhiyun gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@" 113*4882a593Smuzhiyun fi 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun if meta_has_release "${meta}"; then 116*4882a593Smuzhiyun gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@" 117*4882a593Smuzhiyun fi 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun return 120*4882a593Smuzhiyun fi 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun printf "#ifndef ${basename}_relaxed\n" 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun if [ ! -z "${template}" ]; then 125*4882a593Smuzhiyun printf "#ifdef ${basename}\n" 126*4882a593Smuzhiyun fi 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun gen_basic_fallbacks "${basename}" 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun if [ ! -z "${template}" ]; then 131*4882a593Smuzhiyun printf "#endif /* ${arch}${atomic}_${pfx}${name}${sfx} */\n\n" 132*4882a593Smuzhiyun gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@" 133*4882a593Smuzhiyun gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@" 134*4882a593Smuzhiyun gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@" 135*4882a593Smuzhiyun gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_relaxed" "$@" 136*4882a593Smuzhiyun fi 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun printf "#else /* ${basename}_relaxed */\n\n" 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun gen_template_fallback "${ATOMICDIR}/fallbacks/acquire" "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@" 141*4882a593Smuzhiyun gen_template_fallback "${ATOMICDIR}/fallbacks/release" "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@" 142*4882a593Smuzhiyun gen_template_fallback "${ATOMICDIR}/fallbacks/fence" "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@" 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun printf "#endif /* ${basename}_relaxed */\n\n" 145*4882a593Smuzhiyun} 146*4882a593Smuzhiyun 147*4882a593Smuzhiyungen_xchg_fallbacks() 148*4882a593Smuzhiyun{ 149*4882a593Smuzhiyun local xchg="$1"; shift 150*4882a593Smuzhiyuncat <<EOF 151*4882a593Smuzhiyun#ifndef ${xchg}_relaxed 152*4882a593Smuzhiyun#define ${xchg}_relaxed ${xchg} 153*4882a593Smuzhiyun#define ${xchg}_acquire ${xchg} 154*4882a593Smuzhiyun#define ${xchg}_release ${xchg} 155*4882a593Smuzhiyun#else /* ${xchg}_relaxed */ 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun#ifndef ${xchg}_acquire 158*4882a593Smuzhiyun#define ${xchg}_acquire(...) \\ 159*4882a593Smuzhiyun __atomic_op_acquire(${xchg}, __VA_ARGS__) 160*4882a593Smuzhiyun#endif 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun#ifndef ${xchg}_release 163*4882a593Smuzhiyun#define ${xchg}_release(...) \\ 164*4882a593Smuzhiyun __atomic_op_release(${xchg}, __VA_ARGS__) 165*4882a593Smuzhiyun#endif 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun#ifndef ${xchg} 168*4882a593Smuzhiyun#define ${xchg}(...) \\ 169*4882a593Smuzhiyun __atomic_op_fence(${xchg}, __VA_ARGS__) 170*4882a593Smuzhiyun#endif 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun#endif /* ${xchg}_relaxed */ 173*4882a593Smuzhiyun 174*4882a593SmuzhiyunEOF 175*4882a593Smuzhiyun} 176*4882a593Smuzhiyun 177*4882a593Smuzhiyuncat << EOF 178*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun// Generated by $0 181*4882a593Smuzhiyun// DO NOT MODIFY THIS FILE DIRECTLY 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun#ifndef _LINUX_ATOMIC_FALLBACK_H 184*4882a593Smuzhiyun#define _LINUX_ATOMIC_FALLBACK_H 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun#include <linux/compiler.h> 187*4882a593Smuzhiyun 188*4882a593SmuzhiyunEOF 189*4882a593Smuzhiyun 190*4882a593Smuzhiyunfor xchg in "${ARCH}xchg" "${ARCH}cmpxchg" "${ARCH}cmpxchg64"; do 191*4882a593Smuzhiyun gen_xchg_fallbacks "${xchg}" 192*4882a593Smuzhiyundone 193*4882a593Smuzhiyun 194*4882a593Smuzhiyungrep '^[a-z]' "$1" | while read name meta args; do 195*4882a593Smuzhiyun gen_proto "${meta}" "${name}" "${ARCH}" "atomic" "int" ${args} 196*4882a593Smuzhiyundone 197*4882a593Smuzhiyun 198*4882a593Smuzhiyuncat <<EOF 199*4882a593Smuzhiyun#ifdef CONFIG_GENERIC_ATOMIC64 200*4882a593Smuzhiyun#include <asm-generic/atomic64.h> 201*4882a593Smuzhiyun#endif 202*4882a593Smuzhiyun 203*4882a593SmuzhiyunEOF 204*4882a593Smuzhiyun 205*4882a593Smuzhiyungrep '^[a-z]' "$1" | while read name meta args; do 206*4882a593Smuzhiyun gen_proto "${meta}" "${name}" "${ARCH}" "atomic64" "s64" ${args} 207*4882a593Smuzhiyundone 208*4882a593Smuzhiyun 209*4882a593Smuzhiyuncat <<EOF 210*4882a593Smuzhiyun#endif /* _LINUX_ATOMIC_FALLBACK_H */ 211*4882a593SmuzhiyunEOF 212