File tree Expand file tree Collapse file tree 1 file changed +45
-0
lines changed
slipstream/kernel/lib/arch/x86 Expand file tree Collapse file tree 1 file changed +45
-0
lines changed Original file line number Diff line number Diff line change 1+ //! Copyright 2025 The Drift Authors. All rights reserved.
2+ //! Use of this source code is governed by a BSD-style license that can be
3+ //! found in the LICENSE file.
4+
5+ /// Yield the processor momentarily. This should be used in busy waits.
6+ pub fn yield () void {
7+ asm volatile ("pause" );
8+ }
9+
10+ /// Synchronize all memory accesses of all kinds.
11+ pub fn deviceMemoryBarrier () void {
12+ asm volatile ("mfence" ::: "memory" );
13+ }
14+
15+ /// Synchronize the ordering of all memory accesses wrt other CPUs.
16+ pub fn threadMemoryBarrier () void {
17+ deviceMemoryBarrier ();
18+ }
19+
20+ /// Force the processor to complete all modifications to register state and
21+ /// memory by previous instructions (including draining any buffered writes)
22+ /// before the next instruction is fetched.
23+ pub fn serializeInstructions () void {
24+ // [intel/vol3]: 8.3 Serializing Instructions.
25+ // [amd/vol2]: 7.6.4 Serializing Instructions.
26+ //
27+ // `cpuid` is a serializing instruction.
28+ var rax : usize = 0 ;
29+ asm volatile ("cpuid"
30+ : [rax ] "+{ax}" (rax ),
31+ :
32+ : "rbx" , "rcx" , "rdx"
33+ );
34+ }
35+
36+ /// Return the current CPU cycle count.
37+ pub fn cycles () u64 {
38+ var result : u64 = undefined ;
39+ asm volatile ("rdtsc"
40+ : [result ] "={ax}" (result ),
41+ :
42+ : "rdx"
43+ );
44+ return result ;
45+ }
You can’t perform that action at this time.
0 commit comments