82 lines
2.1 KiB
C
82 lines
2.1 KiB
C
#include "../include/utils.h"
|
|
|
|
uint8_t inportb(uint16_t _port)
|
|
{
|
|
uint8_t rv;
|
|
__asm__ __volatile__ ("inb %1, %0" : "=a" (rv) : "dN" (_port));
|
|
return rv;
|
|
}
|
|
|
|
void outportb(uint16_t _port, uint8_t _data)
|
|
{
|
|
__asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data));
|
|
}
|
|
|
|
uint8_t get_rtc(uint8_t reg)
|
|
{
|
|
uint8_t nmi_disable_bit = 0;
|
|
outb(0x70, (nmi_disable_bit << 7) | reg);
|
|
uint8_t result = inb(0x71);
|
|
|
|
return result;
|
|
}
|
|
|
|
void get_fancy_datetime()
|
|
{
|
|
uint8_t century = get_rtc(0x32);
|
|
uint8_t year = get_rtc(0x09);
|
|
uint8_t month = get_rtc(0x08);
|
|
uint8_t day_of_month = get_rtc(0x07);
|
|
uint8_t hour = get_rtc(0x04);
|
|
uint8_t minute = get_rtc(0x02);
|
|
uint8_t second = get_rtc(0x00);
|
|
printf("%X-%X-%X%X %X:%X:%X\n", day_of_month, month, century, year, hour, minute, second);
|
|
}
|
|
|
|
void get_datetime(uint16_t *year, uint8_t *month, uint8_t *day, uint8_t *hour, uint8_t *minute, uint8_t *second)
|
|
{
|
|
uint8_t century = get_rtc(0x32);
|
|
uint8_t year_rtc = get_rtc(0x09);
|
|
|
|
*year = century * 100 + year_rtc;
|
|
*month = get_rtc(0x08);
|
|
*day = get_rtc(0x07);
|
|
*hour = get_rtc(0x04);
|
|
*minute = get_rtc(0x02);
|
|
*second = get_rtc(0x00);
|
|
}
|
|
|
|
uint32_t fat32_datetime(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
|
|
{
|
|
uint16_t fat_year = year - 1980;
|
|
|
|
uint16_t fat_date = (fat_year << 9) | ((month & 0x0F) << 5) | (day & 0x1F);
|
|
uint16_t fat_time = (hour & 0x1F) << 11 | ((minute & 0x3F) >> 1) << 5 | (second / 2) & 0x1F;
|
|
uint32_t fat_datetime = ((uint32_t)fat_date << 16) | fat_time;
|
|
|
|
return fat_datetime;
|
|
}
|
|
|
|
inline void cpuid(int code, uint32_t *a, uint32_t *d)
|
|
{
|
|
asm volatile("cpuid":"=a"(*a),"=d"(*d):"a"(code):"ecx","ebx");
|
|
}
|
|
|
|
const uint32_t CPUID_FLAG_MSR = 1 << 5;
|
|
|
|
bool cpu_has_msr()
|
|
{
|
|
static uint32_t a, d; // eax, edx
|
|
cpuid(1, &a, &d);
|
|
return d & CPUID_FLAG_MSR;
|
|
}
|
|
|
|
void cpu_get_msr(uint32_t msr, uint32_t *lo, uint32_t *hi)
|
|
{
|
|
asm volatile("rdmsr" : "=a"(*lo), "=d"(*hi) : "c"(msr));
|
|
}
|
|
|
|
void cpu_set_msr(uint32_t msr, uint32_t lo, uint32_t hi)
|
|
{
|
|
asm volatile("wrmsr" : : "a"(lo), "d"(hi), "c"(msr));
|
|
} |