1/**
2 * \file
3 * \brief Address-space support for Mackerel CPUID device definitions
4 */
5
6/*
7 * Copyright (c) 2007, 2008, 2010, 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 CPUID_SPACES_H
16#define CPUID_SPACES_H
17
18#ifdef __PIC__
19#       define CPUID(offset, reg) \
20    __asm volatile("push        %%ebx           \n\t"   \
21    "cpuid                       \n\t"                  \
22    "pop         %%ebx           \n\t"                  \
23    : reg                                               \
24    : "a" (offset)                                      \
25                   );
26#else
27#       define CPUID(offset, reg) \
28    __asm volatile("cpuid" : reg : "a" (offset))
29#endif
30
31static inline uint32_t cpuid_eax_read_32(cpuid_t *dev, size_t offset)
32{
33    uint32_t eax;
34    CPUID(offset, "=a" (eax));
35    return eax;
36}
37
38static inline uint32_t cpuid_ebx_read_32(cpuid_t *dev, size_t offset)
39{
40    uint32_t ebx;
41#ifdef __PIC__
42    __asm volatile("push        %%ebx           \n\t"
43                   "mov         %[ebx], %%ebx   \n\t"
44                   "cpuid                       \n\t"
45                   "mov         %%ebx, %[ebx]   \n\t"
46                   "pop         %%ebx           \n\t"
47                   : [ebx] "=r" (ebx)
48                   : "a" (offset)
49                   );
50#else
51    CPUID(offset, "=b" (ebx));
52#endif
53    return ebx;
54}
55
56static inline uint32_t cpuid_ecx_read_32(cpuid_t *dev, size_t offset)
57{
58    uint32_t ecx;
59    CPUID(offset, "=c" (ecx));
60    return ecx;
61}
62
63static inline uint32_t cpuid_edx_read_32(cpuid_t *dev, size_t offset)
64{
65    uint32_t edx;
66    CPUID(offset, "=d" (edx));
67    return edx;
68}
69
70static inline uint32_t cpuid_dcpa_read_32(cpuid_t *dev, size_t offset)
71{
72    return 0;
73}
74
75static inline uint32_t cpuid_dcpb_read_32(cpuid_t *dev, size_t offset)
76{
77    return 0;
78}
79
80static inline uint32_t cpuid_dcpc_read_32(cpuid_t *dev, size_t offset)
81{
82    return 0;
83}
84
85static inline void cpuid_eax_write_32(cpuid_t *dev, size_t offset,
86                                      uint32_t value)
87{
88}
89
90static inline void cpuid_ebx_write_32(cpuid_t *dev, size_t offset,
91                                      uint32_t value)
92{
93}
94
95static inline void cpuid_ecx_write_32(cpuid_t *dev, size_t offset,
96                                      uint32_t value)
97{
98}
99
100static inline void cpuid_edx_write_32(cpuid_t *dev, size_t offset,
101                                      uint32_t value)
102{
103}
104
105static inline void cpuid_dcpa_write_32(cpuid_t *dev, size_t offset,
106                                       uint32_t value)
107{
108}
109
110static inline void cpuid_dcpb_write_32(cpuid_t *dev, size_t offset,
111                                       uint32_t value)
112{
113}
114
115static inline void cpuid_dcpc_write_32(cpuid_t *dev, size_t offset,
116                                       uint32_t value)
117{
118}
119
120#undef CPUID
121
122#endif // CPUID_SPACES_H
123