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.
11 #ifndef _RSEQ_PSEUDOCODE_H
12 #define _RSEQ_PSEUDOCODE_H
15 * Pseudo-code conventions:
18 * [var]: Register associated with C variable "var".
19 * [label]: Jump target associated with C label "label".
21 * load(rX, address): load from memory address to rX
22 * store(rX, address): store to memory address from rX
23 * cbne(rX, rY, target): compare-and-branch to target if rX != rY
24 * cbeq(rX, rY, target): compare-and-branch to target if rX == rY
25 * add(rX, rY): add rY to register rX
26 * memcpy(dest_address, src_address, len): copy len bytes from src_address to dst_address
28 * Critical section helpers identifier convention:
29 * - Begin with an "rseq_" prefix,
30 * - Followed by their simplified pseudo-code,
31 * - Followed by __ and the type (or eventually types) on which the API
32 * applies (similar to the approach taken for C++ mangling).
36 * rseq_load_cbne_store(v, expect, newv)
40 * cbne(r1, [expect], [ne])
50 * rseq_load_add_store(v, count)
63 * rseq_load_cbeq_store_add_load_store(v, expectnot, voffp, load)
67 * cbeq(r1, [expectnot], [eq])
80 * rseq_load_add_load_load_add_store(ptr, off, inc)
96 * rseq_load_cbne_load_cbne_store(v, expect, v2, expect2, newv)
100 * cbne(r1, [expect], [ne])
102 * cbne(r2, [expect2], [ne])
112 * rseq_load_cbne_store_store(v, expect, v2, newv2, newv)
116 * cbne(r1, [expect], [ne])
117 * store([newv2], [v2]) // Store attempt
118 * store([newv], [v]) // Final store
127 * rseq_load_cbne_memcpy_store(v, expect, dst, src, len, newv)
131 * cbne(r1, [expect], [ne])
132 * memcpy([dst], [src], [len]) // Memory copy attempt
133 * store([newv], [v]) // Final store
141 #endif /* _RSEQ_PSEUDOCODE_H */
This page took 0.032388 seconds and 4 git commands to generate.