1 /* SPDX-License-Identifier: MIT */
2 /* SPDX-FileCopyrightText: 2024 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> */
7 * This file contains the pseudo-code of rseq critical section helpers,
8 * to be used as reference for architecture implementation.
12 * Pseudo-code conventions:
15 * [var]: Register associated with C variable "var".
16 * [label]: Jump target associated with C label "label".
18 * load(rX, address): load from memory address to rX
19 * store(rX, address): store to memory address from rX
20 * cbne(rX, rY, target): compare-and-branch to target if rX != rY
21 * cbeq(rX, rY, target): compare-and-branch to target if rX == rY
22 * add(rX, rY): add rY to register rX
23 * memcpy(dest_address, src_address, len): copy len bytes from src_address to dst_address
25 * Critical section helpers identifier convention:
26 * - Begin with an "rseq_" prefix,
27 * - Followed by their simplified pseudo-code,
28 * - Followed by __ and the type (or eventually types) on which the API
29 * applies (similar to the approach taken for C++ mangling).
33 * rseq_load_cbne_store(v, expect, newv)
37 * cbne(r1, [expect], [ne])
47 * rseq_load_add_store(v, count)
60 * rseq_load_cbeq_store_add_load_store(v, expectnot, voffp, load)
64 * cbeq(r1, [expectnot], [eq])
77 * rseq_load_add_load_add_store(ptr, off, inc)
93 * rseq_load_cbne_load_cbne_store(v, expect, v2, expect2, newv)
97 * cbne(r1, [expect], [ne])
99 * cbne(r2, [expect2], [ne])
109 * rseq_load_cbne_store_store(v, expect, v2, newv2, newv)
113 * cbne(r1, [expect], [ne])
114 * store([newv2], [v2]) // Store attempt
115 * store([newv], [v]) // Final store
124 * rseq_load_cbne_memcpy_store(v, expect, dst, src, len, newv)
128 * cbne(r1, [expect], [ne])
129 * memcpy([dst], [src], [len]) // Memory copy attempt
130 * store([newv], [v]) // Final store
This page took 0.036621 seconds and 4 git commands to generate.