xref: /haiku/src/system/kernel/arch/x86/64/cpuid.cpp (revision 8ac3d98578e41dc30233dac84f2d3687d64fe554)
11eba4077SPaweł Dziepak /*
21eba4077SPaweł Dziepak  * Copyright 2014, Paweł Dziepak, pdziepak@quarnos.org.
31eba4077SPaweł Dziepak  * Copyright 2012, Alex Smith, alex@alex-smith.me.uk.
41eba4077SPaweł Dziepak  * Distributed under the terms of the MIT License.
51eba4077SPaweł Dziepak  */
61eba4077SPaweł Dziepak 
71eba4077SPaweł Dziepak 
81eba4077SPaweł Dziepak #include <arch_system_info.h>
91eba4077SPaweł Dziepak 
10*8ac3d985SJérôme Duval #include <cpuid.h>
11*8ac3d985SJérôme Duval 
121eba4077SPaweł Dziepak 
131eba4077SPaweł Dziepak status_t
get_current_cpuid(cpuid_info * info,uint32 eax,uint32 ecx)141eba4077SPaweł Dziepak get_current_cpuid(cpuid_info* info, uint32 eax, uint32 ecx)
151eba4077SPaweł Dziepak {
16*8ac3d985SJérôme Duval 	__cpuid_count(eax, ecx, info->regs.eax, info->regs.ebx, info->regs.ecx,
17*8ac3d985SJérôme Duval 		info->regs.edx);
181eba4077SPaweł Dziepak 	return B_OK;
191eba4077SPaweł Dziepak }
201eba4077SPaweł Dziepak 
211eba4077SPaweł Dziepak 
221eba4077SPaweł Dziepak uint32
get_eflags()231eba4077SPaweł Dziepak get_eflags()
241eba4077SPaweł Dziepak {
251eba4077SPaweł Dziepak 	uint64_t flags;
261eba4077SPaweł Dziepak 	__asm__("pushf; popq %0;" : "=r" (flags));
271eba4077SPaweł Dziepak 	return flags;
281eba4077SPaweł Dziepak }
291eba4077SPaweł Dziepak 
301eba4077SPaweł Dziepak 
311eba4077SPaweł Dziepak void
set_eflags(uint32 value)321eba4077SPaweł Dziepak set_eflags(uint32 value)
331eba4077SPaweł Dziepak {
341eba4077SPaweł Dziepak 	uint64_t flags = value;
351eba4077SPaweł Dziepak 	__asm__("pushq %0; popf;" : : "r" (flags) : "cc");
361eba4077SPaweł Dziepak }
371eba4077SPaweł Dziepak 
38