Fixup of some headers.
[barrelfish] / include / arch / x86 / barrelfish_kpi / asm_inlines_arch.h
1 /**
2  * \file
3  * \brief Some arch specific asm inlines
4  */
5
6 /*
7  * Copyright (c) 2007, 2008, 2009, 2010, 2012, ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 #ifndef ARCH_X86_BARRELFISH_KPI_X86_H
16 #define ARCH_X86_BARRELFISH_KPI_X86_H
17
18 #include <machine/param.h>
19
20 #ifndef __ASSEMBLER__
21
22 /** \brief This code reads the cycle counter */
23 static inline uint64_t rdtsc(void)
24 {
25     uint32_t eax, edx;
26     __asm volatile ("rdtsc" : "=a" (eax), "=d" (edx));
27     return ((uint64_t)edx << 32) | eax;
28 }
29
30 #ifndef __k1om__
31 /** \brief This code reads the cycle counter -- flushing the
32     instruction pipeline first. Throws away the processor ID information. */
33 static inline uint64_t rdtscp(void)
34 {
35     uint32_t eax, edx;
36     __asm volatile ("rdtscp" : "=a" (eax), "=d" (edx) :: "ecx");
37     return ((uint64_t)edx << 32) | eax;
38 }
39 #else
40 static inline uint64_t rdtscp(void)
41 {
42     /* K1OM does not support rdtscp */
43     return rdtsc();
44 }
45 #endif
46
47 static inline uint64_t rdpmc(uint32_t counter)
48 {
49     uint32_t eax, edx;
50
51     __asm volatile("rdpmc"
52                    : "=a" (eax), "=d" (edx)
53                    : "c" (counter)
54                    );
55
56     return ((uint64_t)edx << 32) | eax;
57 }
58
59 static inline void mfence(void)
60 {
61     __asm volatile("mfence");
62 }
63
64 static inline void sfence(void)
65 {
66     __asm volatile("sfence");
67 }
68
69 static inline void lfence(void)
70 {
71     __asm volatile("lfence");
72 }
73
74 static inline void clflush(void *line)
75 {
76     __asm volatile("clflush %0" :: "m" (line));
77 }
78
79 #ifndef __cplusplus
80 /* flush a range of memory from the cache */
81 static inline void cache_flush_range(void *base, size_t len)
82 {
83     //mfence();
84
85     uint8_t *line = (uint8_t *)((uintptr_t)base & ~(CACHE_LINE_SIZE-1UL));
86     do {
87         clflush(line);
88         line += CACHE_LINE_SIZE;
89     } while (line < (uint8_t *)base + len);
90 }
91 #endif
92
93 #endif // __ASSEMBLER__
94
95 #endif // ARCH_X86_BARRELFISH_KPI_X86_H