Skip to content

Commit

Permalink
Добавление программируемого интервального таймера
Browse files Browse the repository at this point in the history
  • Loading branch information
Aren committed Oct 24, 2023
1 parent fe63787 commit 2ba30e8
Show file tree
Hide file tree
Showing 20 changed files with 250 additions and 120 deletions.
2 changes: 1 addition & 1 deletion .clang-format
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
ColumnLimit: 100
ColumnLimit: 80
IndentWidth: 4
UseTab: ForIndentation
TabWidth: 4
Expand Down
3 changes: 2 additions & 1 deletion include/6x8_slim_font.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
#define FONT_6X8_SLIM_CHAR_WIDTH 6
#define FONT_6X8_SLIM_CHAR_HEIGHT 8
#define FONT_6X8_SLIM_FONT_TYPE (FONT_TYPE_MONOSPACED)
#define FONT_6X8_SLIM_ARRAY_LENGTH (FONT_6X8_SLIM_LENGTH * FONT_6X8_SLIM_CHAR_HEIGHT)
#define FONT_6X8_SLIM_ARRAY_LENGTH \
(FONT_6X8_SLIM_LENGTH * FONT_6X8_SLIM_CHAR_HEIGHT)

static const unsigned char font_6x8_slim[FONT_6X8_SLIM_ARRAY_LENGTH] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 32 < >
Expand Down
13 changes: 13 additions & 0 deletions include/arch.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,22 @@
#ifndef ARCH_H
#define ARCH_H

#include <stdint.h>

void arch_init( );
void cpu_init( );
void gdt_init( );
void idt_init( );
void idt_set_int(uint8_t vector, void *int_handler);

static inline void outb(uint16_t port, uint8_t val) {
asm volatile("outb %0, %1" : : "a"(val), "Nd"(port));
}

static inline uint8_t inb(uint16_t port) {
uint8_t ret;
asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port));
return ret;
}

#endif // arch.h
6 changes: 3 additions & 3 deletions include/lock.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ typedef struct {
const char* file;
} lock_t;

#define LOCK_INIT \
(lock_t) { \
0, __FILE__ \
#define LOCK_INIT \
(lock_t) { \
0, __FILE__ \
}

int lock_swap(lock_t* lock);
Expand Down
16 changes: 9 additions & 7 deletions include/tool.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,19 @@

#define abs(x) ((x) < 0 ? -(x) : (x))

#define assert(check) \
do { \
if (!(check)) { \
fb_printf("\nassert() failed in %s() (%s:%d)\n", __func__, __FILE__, __LINE__); \
for (;;) asm volatile("hlt"); \
} \
#define assert(check) \
do { \
if (!(check)) { \
fb_printf("\nassert() failed in %s() (%s:%d)\n", __func__, \
__FILE__, __LINE__); \
for (;;) asm volatile("hlt"); \
} \
} while (0)

#define ALIGN_UP(NUM, ALIGN) (((NUM) + ALIGN - 1) & ~(ALIGN - 1))
#define ALIGN_DOWN(NUM, ALIGN) ((NUM) & ~(ALIGN - 1))
#define CONTAINER_OF(PTR, TYPE, MEMBER) ((TYPE *)((void *)PTR - offsetof(TYPE, MEMBER)))
#define CONTAINER_OF(PTR, TYPE, MEMBER) \
((TYPE *)((void *)PTR - offsetof(TYPE, MEMBER)))

#define BIT_SET(BIT) (bitmap[(BIT) / 8] |= (1 << ((BIT) % 8)))
#define BIT_CLEAR(BIT) (bitmap[(BIT) / 8] &= ~(1 << ((BIT) % 8)))
Expand Down
2 changes: 1 addition & 1 deletion include/version.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
#define VERSION_MAJOR 0
#define VERSION_MINOR 1
#define VERSION_BUILD 293
#define VERSION_BUILD 297
57 changes: 41 additions & 16 deletions kernel/arch/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,11 @@ static void sse_init( ) {
asm volatile("mov %%cr4, %0" : : "r"(_cr4) : "memory");
}

static void cpuid(uint32_t leaf, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) {
asm volatile("cpuid" : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) : "a"(leaf));
static void cpuid(uint32_t leaf, uint32_t *eax, uint32_t *ebx, uint32_t *ecx,
uint32_t *edx) {
asm volatile("cpuid"
: "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx)
: "a"(leaf));
}

static void msr_get(uint32_t msr, uint32_t *lo, uint32_t *hi) {
Expand Down Expand Up @@ -66,7 +69,8 @@ static void l2_cache( ) {
assoc = (ecx >> 12) & 0x07;
cache = (ecx >> 16) & 0xFFFF;

fb_printf("Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", lsize, assoc, cache);
fb_printf("Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n",
lsize, assoc, cache);
}

static void do_amd( ) {
Expand Down Expand Up @@ -95,7 +99,8 @@ static void brandname( ) {
uint32_t manufacturer[4];
char manufacturer_string[13];

cpuid(0, &manufacturer[3], &manufacturer[0], &manufacturer[2], &manufacturer[1]);
cpuid(0, &manufacturer[3], &manufacturer[0], &manufacturer[2],
&manufacturer[1]);
tool_memcpy(manufacturer_string, manufacturer, 12);

brand_string[48] = 0;
Expand Down Expand Up @@ -124,7 +129,8 @@ void cpu_init( ) {
if ((edx >> 22) & 1) {
acpi_msrs_support = true;
fb_printf("Встроенный терморегулятор MSRS для ACPI\n");
fb_printf("Температура: %u (в QEMU/KVM всегда 0)\n", get_cpu_temperature( ));
fb_printf("Температура: %u (в QEMU/KVM всегда 0)\n",
get_cpu_temperature( ));
}

if ((edx >> 23) & 1) {
Expand All @@ -139,7 +145,9 @@ void cpu_init( ) {
}

cpuid(1, &eax, &ebx, &ecx, &edx);
if ((edx >> 29) & 1) { fb_printf("Термоконтроллер автоматически ограничивает температуру\n"); }
if ((edx >> 29) & 1) {
fb_printf("Термоконтроллер автоматически ограничивает температуру\n");
}

if ((ecx >> 28) & 1) {
avx_support = true;
Expand All @@ -160,17 +168,22 @@ void cpu_init( ) {

if ((edx >> 5) & 1) { fb_printf("Регистры MSR подерживаются!\n"); }

// if ((edx >> 6) & 1) { fb_printf("Расширение физического адреса поддерживается!\n"); }
if ((edx >> 6) & 1) {
fb_printf("Расширение физического адреса поддерживается!\n");
}

// if ((edx >> 7) & 1) { fb_printf("Исключение проверки компьютера (MCE) поддерживается!\n"); }
if ((edx >> 7) & 1) {
fb_printf("Исключение проверки компьютера (MCE) поддерживается!\n");
}

if ((edx >> 9) & 1) {
fb_printf("Усовершенствованный программируемый контроллер прерываний "
"поддерживается!\n");
}

if ((edx >> 10) & 1) {
fb_printf("SYSCALL/SYSRET(для AMD семейства 5 линейки 7) подерживаются!\n");
fb_printf(
"SYSCALL/SYSRET(для AMD семейства 5 линейки 7) подерживаются!\n");
}
if ((edx >> 11) & 1) { fb_printf("SYSCALL/SYSRET подерживаются!\n"); }

Expand All @@ -183,19 +196,31 @@ void cpu_init( ) {
if ((ecx >> 7) & 1) { fb_printf("Смещенный режим SSE поддерживается!\n"); }

cpuid(0x80000007, &eax, &ebx, &ecx, &edx);
// if ((ebx >> 0) & 1) { fb_printf("Восстановление после переполнения MCA поддерживается!\n"); }
// if ((ebx >> 1) & 1) { fb_printf("Возможность локализации и восстановления неисправимых
// программных ошибок поддерживается!\n"); }
if ((ebx >> 0) & 1) {
fb_printf("Восстановление после переполнения MCA поддерживается!\n");
}
if ((ebx >> 1) & 1) {
fb_printf("Возможность локализации и восстановления неисправимых "
"программных ошибок поддерживается!\n");
}
if ((edx >> 0) & 1) { fb_printf("Датчик температуры поддерживается!\n"); }
if ((edx >> 3) & 1) { fb_printf("Терморегулятор поддерживается!\n"); }
if ((edx >> 4) & 1) { fb_printf("Аппаратный терморегулятор (HTC) поддерживается!\n"); }
if ((edx >> 5) & 1) { fb_printf("Программный терморегулятор (STC) поддерживается!\n"); }
if ((edx >> 6) & 1) { fb_printf("Управление множителем 100 МГц поддерживается!\n"); }
if ((edx >> 4) & 1) {
fb_printf("Аппаратный терморегулятор (HTC) поддерживается!\n");
}
if ((edx >> 5) & 1) {
fb_printf("Программный терморегулятор (STC) поддерживается!\n");
}
if ((edx >> 6) & 1) {
fb_printf("Управление множителем 100 МГц поддерживается!\n");
}

// fb_printf("0x80000007[ECX] = 0x%x (%u)\n", ecx, ecx);

cpuid(0xC0000000, &eax, &ebx, &ecx, &edx);
if (eax > 0xC0000000) { fb_printf("0xC0000000 [EAX] = 0x%x (%u)\n", eax, eax); }
if (eax > 0xC0000000) {
fb_printf("0xC0000000 [EAX] = 0x%x (%u)\n", eax, eax);
}

brandname( );
l2_cache( );
Expand Down
4 changes: 2 additions & 2 deletions kernel/arch/gdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ void gdt_load( ) {
load_gdt((uint64_t)&gdtr);
}

void set_gdt_entry(gdt_entry_t *entry, uint16_t limit, uint64_t base, uint8_t access,
uint8_t granularity) {
void set_gdt_entry(gdt_entry_t *entry, uint16_t limit, uint64_t base,
uint8_t access, uint8_t granularity) {
entry->limit = limit;
entry->base_16 = base & 0xFFFF;
entry->base_middle_16 = (base >> 16) & 0xFF;
Expand Down
55 changes: 13 additions & 42 deletions kernel/arch/idt.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*
*/

#include "idt.h"
#include <arch.h>
#include <fb.h>
#include <stdbool.h>
Expand Down Expand Up @@ -57,39 +58,6 @@ void *isr[256];
extern void *isr_stubs[];
static idt_ptr_t idtr;

#define NO_NAME "Не задано название"

const char *exception_names[] = { "Деление на ноль",
"Отладка",
"NMI",
"Точка останова",
"Переполнение",
"Выход за границы",
"Недопустимая операция",
"Устройство недоступно",
"Двойное исключение",
NO_NAME,
"Недопустимый TSS",
"Сегмент не присутствует",
"Ошибка сегмента стека",
"Общая защитная ошибка",
"Ошибка страницы",
NO_NAME,
"x87 исключение",
"Проверка выравнивания",
"Ошибка машины",
"SIMD исключение",
"Виртуализация",
NO_NAME,
NO_NAME,
NO_NAME,
NO_NAME,
NO_NAME,
NO_NAME,
NO_NAME,
NO_NAME,
"Безопасность" };

void idt_load( ) {
asm volatile("lidt %0" : : "m"(idtr));
asm volatile("sti");
Expand Down Expand Up @@ -121,9 +89,10 @@ static void exception_handler(struct frame state) {
" RIP=%x RFLAGS=%x\n"
" CS=%x SS=%x\n"
" ERR=%x INT=%u",
state.rax, state.rbx, state.rcx, state.rdx, state.rsi, state.rdi, state.rbp,
state.rsp, state.r8, state.r9, state.r10, state.r11, state.r12, state.r13, state.r14,
state.r15, state.rip, state.rflags, state.cs, state.ss, state.err, state.int_number);
state.rax, state.rbx, state.rcx, state.rdx, state.rsi, state.rdi,
state.rbp, state.rsp, state.r8, state.r9, state.r10, state.r11,
state.r12, state.r13, state.r14, state.r15, state.rip,
state.rflags, state.cs, state.ss, state.err, state.int_number);

asm volatile("cli; hlt");
}
Expand All @@ -140,11 +109,11 @@ void idt_init( ) {
idtr = (idt_ptr_t){ .limit = sizeof(idt) - 1, .base = (uint64_t)idt };

for (uint64_t i = 0; i < 256; i++) {
if (i < 32) {
encode_idt_entry(i, isr_stubs[i], 0x8e);
if (i < 31) {
encode_idt_entry(i, isr_stubs[i], 0x8E);
isr[i] = (void *)exception_handler;
} else {
encode_idt_entry(i, isr_stubs[i], 0x8e);
encode_idt_entry(i, isr_stubs[i], 0x8E);
isr[i] = (void *)isr_generic;
}
}
Expand All @@ -153,6 +122,8 @@ void idt_init( ) {
fb_printf("IDT инициализирован\n");
}

void idt_set_ist(uint8_t vector, uint8_t ist) {
idt[vector].ist = ist;
}
void idt_set_int(uint8_t vector, void *int_handler) {
encode_idt_entry(vector, int_handler, 0x8E);
isr[vector] = int_handler;
idt_load( );
}
32 changes: 32 additions & 0 deletions kernel/arch/idt.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#define NO_NAME "Не задано название"

const char *exception_names[] = { "Деление на ноль",
"Отладка",
"NMI",
"Точка останова",
"Переполнение",
"Выход за границы",
"Недопустимая операция",
"Устройство недоступно",
"Двойное исключение",
NO_NAME,
"Недопустимый TSS",
"Сегмент не присутствует",
"Ошибка сегмента стека",
"Общая защитная ошибка",
"Ошибка страницы",
NO_NAME,
"x87 исключение",
"Проверка выравнивания",
"Ошибка машины",
"SIMD исключение",
"Виртуализация",
NO_NAME,
NO_NAME,
NO_NAME,
NO_NAME,
NO_NAME,
NO_NAME,
NO_NAME,
NO_NAME,
"Безопасность" };
32 changes: 32 additions & 0 deletions kernel/arch/pit.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/**
* pit.c
* Программируемый интервальный таймер
*
* Настройка программируемого интервального таймера и
*
*/

#include <arch.h>
#include <fb.h>
#include <stdbool.h>
#include <stdint.h>
#include <tool.h>

static uint64_t count = 0;

static void isr_generic( ) {
fb_printf("\nТик! %u", count++);
}

void pit_set_interval(int hz) {
int divisor = 1193180 / hz; // Вычисляем делитель
outb(0x43, 0x36); // Устанавливаем байт команды 0x36
outb(0x40, divisor & 0xFF); // Устанавливаем младший байт делителя
outb(0x40, divisor >> 8); // Устанавливаем старший байт делителя
}

void pit_init( ) {
idt_set_int(32, isr_generic);
pit_set_interval(100);
asm volatile("sti");
}
Loading

0 comments on commit 2ba30e8

Please sign in to comment.