aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/runtime/volatile/volatile.go
blob: 47262f34703ac015db9beba5e8843485073d022c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Package volatile provides definitions for volatile loads and stores. These
// are implemented as compiler builtins.
//
// The load operations load a volatile value. The store operations store to a
// volatile value. The compiler will emit exactly one load or store operation
// when possible and will not reorder volatile operations. However, the compiler
// may move other operations across load/store operations, so make sure that all
// relevant loads/stores are done in a volatile way if this is a problem.
//
// These loads and stores are commonly used to read/write values from memory
// mapped peripheral devices. They do not provide atomicity, use the sync/atomic
// package for that.
//
// For more details: https://llvm.org/docs/LangRef.html#volatile-memory-accesses
// and https://blog.regehr.org/archives/28.
package volatile

// LoadUint8 loads the volatile value *addr.
func LoadUint8(addr *uint8) (val uint8)

// LoadUint16 loads the volatile value *addr.
func LoadUint16(addr *uint16) (val uint16)

// LoadUint32 loads the volatile value *addr.
func LoadUint32(addr *uint32) (val uint32)

// StoreUint8 stores val to the volatile value *addr.
func StoreUint8(addr *uint8, val uint8)

// StoreUint16 stores val to the volatile value *addr.
func StoreUint16(addr *uint16, val uint16)

// StoreUint32 stores val to the volatile value *addr.
func StoreUint32(addr *uint32, val uint32)