xref: /haiku/src/system/kernel/arch/x86/64/cpuid.cpp (revision 1eba40776dad1af70c3e04ede9cb543c6aa04195)
1*1eba4077SPaweł Dziepak /*
2*1eba4077SPaweł Dziepak  * Copyright 2014, Paweł Dziepak, pdziepak@quarnos.org.
3*1eba4077SPaweł Dziepak  * Copyright 2012, Alex Smith, alex@alex-smith.me.uk.
4*1eba4077SPaweł Dziepak  * Distributed under the terms of the MIT License.
5*1eba4077SPaweł Dziepak  */
6*1eba4077SPaweł Dziepak 
7*1eba4077SPaweł Dziepak 
8*1eba4077SPaweł Dziepak #include <arch_system_info.h>
9*1eba4077SPaweł Dziepak 
10*1eba4077SPaweł Dziepak 
11*1eba4077SPaweł Dziepak status_t
12*1eba4077SPaweł Dziepak get_current_cpuid(cpuid_info* info, uint32 eax, uint32 ecx)
13*1eba4077SPaweł Dziepak {
14*1eba4077SPaweł Dziepak 	__asm__("cpuid"
15*1eba4077SPaweł Dziepak 		: "=a" (info->regs.eax), "=b" (info->regs.ebx), "=c" (info->regs.ecx),
16*1eba4077SPaweł Dziepak 			"=d" (info->regs.edx)
17*1eba4077SPaweł Dziepak 		: "a" (eax), "c" (ecx));
18*1eba4077SPaweł Dziepak 	return B_OK;
19*1eba4077SPaweł Dziepak }
20*1eba4077SPaweł Dziepak 
21*1eba4077SPaweł Dziepak 
22*1eba4077SPaweł Dziepak uint32
23*1eba4077SPaweł Dziepak get_eflags()
24*1eba4077SPaweł Dziepak {
25*1eba4077SPaweł Dziepak 	uint64_t flags;
26*1eba4077SPaweł Dziepak 	__asm__("pushf; popq %0;" : "=r" (flags));
27*1eba4077SPaweł Dziepak 	return flags;
28*1eba4077SPaweł Dziepak }
29*1eba4077SPaweł Dziepak 
30*1eba4077SPaweł Dziepak 
31*1eba4077SPaweł Dziepak void
32*1eba4077SPaweł Dziepak set_eflags(uint32 value)
33*1eba4077SPaweł Dziepak {
34*1eba4077SPaweł Dziepak 	uint64_t flags = value;
35*1eba4077SPaweł Dziepak 	__asm__("pushq %0; popf;" : : "r" (flags) : "cc");
36*1eba4077SPaweł Dziepak }
37*1eba4077SPaweł Dziepak 
38