+}
+
+int
+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);
+
+ return (edx & 0x100);
+}
+
+void
+cpu_rdmsr(u32_t msr_idx, u32_t* reg_high, u32_t* reg_low)
+{
+ u32_t h = 0, l = 0;
+ asm volatile("rdmsr" : "=d"(h), "=a"(l) : "c"(msr_idx));
+
+ *reg_high = h;
+ *reg_low = l;
+}
+
+void
+cpu_wrmsr(u32_t msr_idx, u32_t reg_high, u32_t reg_low)
+{
+ asm volatile("wrmsr" : : "d"(reg_high), "a"(reg_low), "c"(msr_idx));
+}
+
+int
+rnd_is_supported()
+{
+ reg32 eax, ebx, ecx, edx;
+ __get_cpuid(0x01, &eax, &ebx, &ecx, &edx);
+ return (ecx & (1 << 30));