git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix: corner case for x87 context restore on execve
[lunaix-os.git]
/
lunaix-os
/
hal
/
cpu.c
diff --git
a/lunaix-os/hal/cpu.c
b/lunaix-os/hal/cpu.c
index ab5432c9642402556c0282eb8f0ee5982d22d9fb..77059b603ba51009622921a1329ee3b737c23b4e 100644
(file)
--- a/
lunaix-os/hal/cpu.c
+++ b/
lunaix-os/hal/cpu.c
@@
-1,11
+1,14
@@
+#include <cpuid.h>
#include <hal/cpu.h>
#include <hal/cpu.h>
+#include <hal/rnd.h>
#include <stdint.h>
#include <stdint.h>
-#include <cpuid.h>
-void cpu_get_model(char* model_out) {
- uint32_t* out = (uint32_t*)model_out;
+void
+cpu_get_model(char* model_out)
+{
+ u32_t* out = (u32_t*)model_out;
reg32 eax = 0, ebx = 0, edx = 0, ecx = 0;
reg32 eax = 0, ebx = 0, edx = 0, ecx = 0;
-
+
__get_cpuid(0, &eax, &ebx, &ecx, &edx);
out[0] = ebx;
__get_cpuid(0, &eax, &ebx, &ecx, &edx);
out[0] = ebx;
@@
-16,44
+19,47
@@
void cpu_get_model(char* model_out) {
#define BRAND_LEAF 0x80000000UL
#define BRAND_LEAF 0x80000000UL
-int cpu_brand_string_supported() {
+int
+cpu_brand_string_supported()
+{
reg32 supported = __get_cpuid_max(BRAND_LEAF, 0);
return (supported >= 0x80000004UL);
}
reg32 supported = __get_cpuid_max(BRAND_LEAF, 0);
return (supported >= 0x80000004UL);
}
-void cpu_get_brand(char* brand_out) {
- if(!cpu_brand_string_supported()) {
+void
+cpu_get_brand(char* brand_out)
+{
+ if (!cpu_brand_string_supported()) {
brand_out[0] = '?';
brand_out[1] = '\0';
}
brand_out[0] = '?';
brand_out[1] = '\0';
}
- u
int32_t* out = (uint32_t*)
brand_out;
+ u
32_t* out = (u32_t*)
brand_out;
reg32 eax = 0, ebx = 0, edx = 0, ecx = 0;
reg32 eax = 0, ebx = 0, edx = 0, ecx = 0;
- for (uint32_t i = 2, j = 0; i < 5; i++)
- {
+ for (u32_t i = 2, j = 0; i < 5; i++) {
__get_cpuid(BRAND_LEAF + i, &eax, &ebx, &ecx, &edx);
out[j] = eax;
out[j + 1] = ebx;
out[j + 2] = ecx;
out[j + 3] = edx;
__get_cpuid(BRAND_LEAF + i, &eax, &ebx, &ecx, &edx);
out[j] = eax;
out[j + 1] = ebx;
out[j + 2] = ecx;
out[j + 3] = edx;
- j
+=
4;
+ j
+=
4;
}
brand_out[48] = '\0';
}
}
brand_out[48] = '\0';
}
-
int
int
-cpu_has_apic() {
+cpu_has_apic()
+{
// reference: Intel manual, section 10.4.2
reg32 eax = 0, ebx = 0, edx = 0, ecx = 0;
__get_cpuid(1, &eax, &ebx, &ecx, &edx);
// reference: Intel manual, section 10.4.2
reg32 eax = 0, ebx = 0, edx = 0, ecx = 0;
__get_cpuid(1, &eax, &ebx, &ecx, &edx);
-
+
return (edx & 0x100);
}
void
return (edx & 0x100);
}
void
-cpu_rdmsr(u
int32_t msr_idx, uint32_t* reg_high, uint
32_t* reg_low)
+cpu_rdmsr(u
32_t msr_idx, u32_t* reg_high, u
32_t* reg_low)
{
{
- u
int
32_t h = 0, l = 0;
+ u32_t h = 0, l = 0;
asm volatile("rdmsr" : "=d"(h), "=a"(l) : "c"(msr_idx));
*reg_high = h;
asm volatile("rdmsr" : "=d"(h), "=a"(l) : "c"(msr_idx));
*reg_high = h;
@@
-61,7
+67,15
@@
cpu_rdmsr(uint32_t msr_idx, uint32_t* reg_high, uint32_t* reg_low)
}
void
}
void
-cpu_wrmsr(u
int32_t msr_idx, uint32_t reg_high, uint
32_t reg_low)
+cpu_wrmsr(u
32_t msr_idx, u32_t reg_high, u
32_t reg_low)
{
asm volatile("wrmsr" : : "d"(reg_high), "a"(reg_low), "c"(msr_idx));
{
asm volatile("wrmsr" : : "d"(reg_high), "a"(reg_low), "c"(msr_idx));
+}
+
+int
+rnd_is_supported()
+{
+ reg32 eax = 0, ebx = 0, ecx = 0, edx = 0;
+ __get_cpuid(0x01, &eax, &ebx, &ecx, &edx);
+ return (ecx & (1 << 30));
}
\ No newline at end of file
}
\ No newline at end of file