x86: Rename VPD (XCC)
[akaros.git] / kern / include / ros / atomic.h
1 /* Copyright (c) 2010 The Regents of the University of California
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Locking and atomics that are part of the kernel interface. */
6
7 #pragma once
8
9 #include <ros/common.h>
10 #include <ros/arch/membar.h>
11
12 typedef void* atomic_t;
13
14 /* The seq counters are used by userspace to see if the kernel is updating
15  * something or if something is valid, such as the vcore->pcore mapping.  The
16  * way a reader can tell nothing has changed is to read the counter before and
17  * after.  If the value has changed, the reader needs to re-read.  If the value
18  * is odd, a write is in progress or it is otherwise invalid/locked. */
19
20 typedef uint32_t seq_ctr_t;
21 #define SEQCTR_INITIALIZER 0
22
23 static inline bool seq_is_locked(seq_ctr_t seq_ctr);
24 static inline bool seqctr_retry(seq_ctr_t old_ctr, seq_ctr_t new_ctr);
25
26 /* Basic helpers for readers.  Ex:
27  * do {
28  *              seq_ctr_t seq = kernel_maintained_seq_ctr
29  *              read_data_whatever();
30  * } while (seqctr_retry(seq, kernel_maintained_seq_ctr);
31  */
32 static inline bool seq_is_locked(seq_ctr_t seq_ctr)
33 {
34         return seq_ctr % 2;
35 }
36
37 static inline bool seqctr_retry(seq_ctr_t old_ctr, seq_ctr_t new_ctr)
38 {
39         rmb();  /* don't allow protected reads to reorder after the check */
40         return (seq_is_locked(old_ctr)) || (old_ctr != new_ctr);
41 }