Path: blob/master/scripts/atomic/gen-atomic-fallback.sh
26285 views
#!/bin/sh1# SPDX-License-Identifier: GPL-2.023ATOMICDIR=$(dirname $0)45. ${ATOMICDIR}/atomic-tbl.sh67#gen_template_fallback(template, meta, pfx, name, sfx, order, atomic, int, args...)8gen_template_fallback()9{10local template="$1"; shift11local meta="$1"; shift12local pfx="$1"; shift13local name="$1"; shift14local sfx="$1"; shift15local order="$1"; shift16local atomic="$1"; shift17local int="$1"; shift1819local ret="$(gen_ret_type "${meta}" "${int}")"20local retstmt="$(gen_ret_stmt "${meta}")"21local params="$(gen_params "${int}" "${atomic}" "$@")"22local args="$(gen_args "$@")"2324. ${template}25}2627#gen_order_fallback(meta, pfx, name, sfx, order, atomic, int, args...)28gen_order_fallback()29{30local meta="$1"; shift31local pfx="$1"; shift32local name="$1"; shift33local sfx="$1"; shift34local order="$1"; shift3536local tmpl_order=${order#_}37local tmpl="${ATOMICDIR}/fallbacks/${tmpl_order:-fence}"38gen_template_fallback "${tmpl}" "${meta}" "${pfx}" "${name}" "${sfx}" "${order}" "$@"39}4041#gen_proto_fallback(meta, pfx, name, sfx, order, atomic, int, args...)42gen_proto_fallback()43{44local meta="$1"; shift45local pfx="$1"; shift46local name="$1"; shift47local sfx="$1"; shift48local order="$1"; shift4950local tmpl="$(find_fallback_template "${pfx}" "${name}" "${sfx}" "${order}")"51gen_template_fallback "${tmpl}" "${meta}" "${pfx}" "${name}" "${sfx}" "${order}" "$@"52}5354#gen_proto_order_variant(meta, pfx, name, sfx, order, atomic, int, args...)55gen_proto_order_variant()56{57local meta="$1"; shift58local pfx="$1"; shift59local name="$1"; shift60local sfx="$1"; shift61local order="$1"; shift62local atomic="$1"; shift63local int="$1"; shift6465local atomicname="${atomic}_${pfx}${name}${sfx}${order}"66local basename="${atomic}_${pfx}${name}${sfx}"6768local template="$(find_fallback_template "${pfx}" "${name}" "${sfx}" "${order}")"6970local ret="$(gen_ret_type "${meta}" "${int}")"71local retstmt="$(gen_ret_stmt "${meta}")"72local params="$(gen_params "${int}" "${atomic}" "$@")"73local args="$(gen_args "$@")"7475gen_kerneldoc "raw_" "${meta}" "${pfx}" "${name}" "${sfx}" "${order}" "${atomic}" "${int}" "$@"7677printf "static __always_inline ${ret}\n"78printf "raw_${atomicname}(${params})\n"79printf "{\n"8081# Where there is no possible fallback, this order variant is mandatory82# and must be provided by arch code. Add a comment to the header to83# make this obvious.84#85# Ideally we'd error on a missing definition, but arch code might86# define this order variant as a C function without a preprocessor87# symbol.88if [ -z ${template} ] && [ -z "${order}" ] && ! meta_has_relaxed "${meta}"; then89printf "\t${retstmt}arch_${atomicname}(${args});\n"90printf "}\n\n"91return92fi9394printf "#if defined(arch_${atomicname})\n"95printf "\t${retstmt}arch_${atomicname}(${args});\n"9697# Allow FULL/ACQUIRE/RELEASE ops to be defined in terms of RELAXED ops98if [ "${order}" != "_relaxed" ] && meta_has_relaxed "${meta}"; then99printf "#elif defined(arch_${basename}_relaxed)\n"100gen_order_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "${order}" "${atomic}" "${int}" "$@"101fi102103# Allow ACQUIRE/RELEASE/RELAXED ops to be defined in terms of FULL ops104if [ ! -z "${order}" ] && ! meta_is_implicitly_relaxed "${meta}"; then105printf "#elif defined(arch_${basename})\n"106printf "\t${retstmt}arch_${basename}(${args});\n"107fi108109printf "#else\n"110if [ ! -z "${template}" ]; then111gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "${order}" "${atomic}" "${int}" "$@"112else113printf "#error \"Unable to define raw_${atomicname}\"\n"114fi115116printf "#endif\n"117printf "}\n\n"118}119120121#gen_proto_order_variants(meta, pfx, name, sfx, atomic, int, args...)122gen_proto_order_variants()123{124local meta="$1"; shift125local pfx="$1"; shift126local name="$1"; shift127local sfx="$1"; shift128local atomic="$1"129130gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@"131132if meta_has_acquire "${meta}"; then133gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@"134fi135136if meta_has_release "${meta}"; then137gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@"138fi139140if meta_has_relaxed "${meta}"; then141gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_relaxed" "$@"142fi143}144145#gen_basic_fallbacks(basename)146gen_basic_fallbacks()147{148local basename="$1"; shift149cat << EOF150#define raw_${basename}_acquire arch_${basename}151#define raw_${basename}_release arch_${basename}152#define raw_${basename}_relaxed arch_${basename}153EOF154}155156gen_order_fallbacks()157{158local xchg="$1"; shift159160cat <<EOF161162#define raw_${xchg}_relaxed arch_${xchg}_relaxed163164#ifdef arch_${xchg}_acquire165#define raw_${xchg}_acquire arch_${xchg}_acquire166#else167#define raw_${xchg}_acquire(...) \\168__atomic_op_acquire(arch_${xchg}, __VA_ARGS__)169#endif170171#ifdef arch_${xchg}_release172#define raw_${xchg}_release arch_${xchg}_release173#else174#define raw_${xchg}_release(...) \\175__atomic_op_release(arch_${xchg}, __VA_ARGS__)176#endif177178#ifdef arch_${xchg}179#define raw_${xchg} arch_${xchg}180#else181#define raw_${xchg}(...) \\182__atomic_op_fence(arch_${xchg}, __VA_ARGS__)183#endif184185EOF186}187188gen_xchg_order_fallback()189{190local xchg="$1"; shift191local order="$1"; shift192local forder="${order:-_fence}"193194printf "#if defined(arch_${xchg}${order})\n"195printf "#define raw_${xchg}${order} arch_${xchg}${order}\n"196197if [ "${order}" != "_relaxed" ]; then198printf "#elif defined(arch_${xchg}_relaxed)\n"199printf "#define raw_${xchg}${order}(...) \\\\\n"200printf " __atomic_op${forder}(arch_${xchg}, __VA_ARGS__)\n"201fi202203if [ ! -z "${order}" ]; then204printf "#elif defined(arch_${xchg})\n"205printf "#define raw_${xchg}${order} arch_${xchg}\n"206fi207208printf "#else\n"209printf "extern void raw_${xchg}${order}_not_implemented(void);\n"210printf "#define raw_${xchg}${order}(...) raw_${xchg}${order}_not_implemented()\n"211printf "#endif\n\n"212}213214gen_xchg_fallbacks()215{216local xchg="$1"; shift217218for order in "" "_acquire" "_release" "_relaxed"; do219gen_xchg_order_fallback "${xchg}" "${order}"220done221}222223gen_try_cmpxchg_fallback()224{225local prefix="$1"; shift226local cmpxchg="$1"; shift;227local suffix="$1"; shift;228229cat <<EOF230#define raw_${prefix}try_${cmpxchg}${suffix}(_ptr, _oldp, _new) \\231({ \\232typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \\233___r = raw_${prefix}${cmpxchg}${suffix}((_ptr), ___o, (_new)); \\234if (unlikely(___r != ___o)) \\235*___op = ___r; \\236likely(___r == ___o); \\237})238EOF239}240241gen_try_cmpxchg_order_fallback()242{243local cmpxchg="$1"; shift244local order="$1"; shift245local forder="${order:-_fence}"246247printf "#if defined(arch_try_${cmpxchg}${order})\n"248printf "#define raw_try_${cmpxchg}${order} arch_try_${cmpxchg}${order}\n"249250if [ "${order}" != "_relaxed" ]; then251printf "#elif defined(arch_try_${cmpxchg}_relaxed)\n"252printf "#define raw_try_${cmpxchg}${order}(...) \\\\\n"253printf " __atomic_op${forder}(arch_try_${cmpxchg}, __VA_ARGS__)\n"254fi255256if [ ! -z "${order}" ]; then257printf "#elif defined(arch_try_${cmpxchg})\n"258printf "#define raw_try_${cmpxchg}${order} arch_try_${cmpxchg}\n"259fi260261printf "#else\n"262gen_try_cmpxchg_fallback "" "${cmpxchg}" "${order}"263printf "#endif\n\n"264}265266gen_try_cmpxchg_order_fallbacks()267{268local cmpxchg="$1"; shift;269270for order in "" "_acquire" "_release" "_relaxed"; do271gen_try_cmpxchg_order_fallback "${cmpxchg}" "${order}"272done273}274275gen_def_and_try_cmpxchg_fallback()276{277local prefix="$1"; shift278local cmpxchg="$1"; shift279local suffix="$1"; shift280281printf "#define raw_${prefix}${cmpxchg}${suffix} arch_${prefix}${cmpxchg}${suffix}\n\n"282printf "#ifdef arch_${prefix}try_${cmpxchg}${suffix}\n"283printf "#define raw_${prefix}try_${cmpxchg}${suffix} arch_${prefix}try_${cmpxchg}${suffix}\n"284printf "#else\n"285gen_try_cmpxchg_fallback "${prefix}" "${cmpxchg}" "${suffix}"286printf "#endif\n\n"287}288289cat << EOF290// SPDX-License-Identifier: GPL-2.0291292// Generated by $0293// DO NOT MODIFY THIS FILE DIRECTLY294295#ifndef _LINUX_ATOMIC_FALLBACK_H296#define _LINUX_ATOMIC_FALLBACK_H297298#include <linux/compiler.h>299300EOF301302for xchg in "xchg" "cmpxchg" "cmpxchg64" "cmpxchg128"; do303gen_xchg_fallbacks "${xchg}"304done305306for cmpxchg in "cmpxchg" "cmpxchg64" "cmpxchg128"; do307gen_try_cmpxchg_order_fallbacks "${cmpxchg}"308done309310for cmpxchg in "cmpxchg" "cmpxchg64" "cmpxchg128"; do311gen_def_and_try_cmpxchg_fallback "" "${cmpxchg}" "_local"312done313314for cmpxchg in "cmpxchg"; do315gen_def_and_try_cmpxchg_fallback "sync_" "${cmpxchg}" ""316done317318grep '^[a-z]' "$1" | while read name meta args; do319gen_proto "${meta}" "${name}" "atomic" "int" ${args}320done321322cat <<EOF323#ifdef CONFIG_GENERIC_ATOMIC64324#include <asm-generic/atomic64.h>325#endif326327EOF328329grep '^[a-z]' "$1" | while read name meta args; do330gen_proto "${meta}" "${name}" "atomic64" "s64" ${args}331done332333cat <<EOF334#endif /* _LINUX_ATOMIC_FALLBACK_H */335EOF336337338