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