mirror of
https://github.com/tailix/kernel.git
synced 2024-11-20 11:16:10 -05:00
Use <kernaux/asm/*.h>
This commit is contained in:
parent
18deba7396
commit
3e44e7c0df
4 changed files with 46 additions and 45 deletions
|
@ -1,6 +1,7 @@
|
||||||
#include "paging.h"
|
#include "paging.h"
|
||||||
#include "panic.h"
|
#include "panic.h"
|
||||||
|
|
||||||
|
#include <kernaux/asm/i386.h>
|
||||||
#include <kernaux/libc.h>
|
#include <kernaux/libc.h>
|
||||||
#include <kernaux/stdlib.h>
|
#include <kernaux/stdlib.h>
|
||||||
|
|
||||||
|
@ -9,37 +10,37 @@ static void mapping(struct Paging *paging, uint32_t virt, uint32_t phys);
|
||||||
void paging_load(struct Paging *const paging)
|
void paging_load(struct Paging *const paging)
|
||||||
{
|
{
|
||||||
uint32_t page_dir_phys = (uint32_t)&paging->page_dir;
|
uint32_t page_dir_phys = (uint32_t)&paging->page_dir;
|
||||||
kernaux_arch_i386_write_cr3(page_dir_phys);
|
kernaux_asm_i386_write_cr3(page_dir_phys);
|
||||||
}
|
}
|
||||||
|
|
||||||
void paging_enable()
|
void paging_enable()
|
||||||
{
|
{
|
||||||
uint32_t cr0 = kernaux_arch_i386_read_cr0();
|
uint32_t cr0 = kernaux_asm_i386_read_cr0();
|
||||||
uint32_t cr4 = kernaux_arch_i386_read_cr4();
|
uint32_t cr4 = kernaux_asm_i386_read_cr4();
|
||||||
|
|
||||||
assert(cr0 & KERNAUX_ARCH_I386_CR0_PE, "The boot loader should have put us in protected mode.");
|
assert(cr0 & KERNAUX_ARCH_I386_CR0_PE, "The boot loader should have put us in protected mode.");
|
||||||
|
|
||||||
// First clear PG and PGE flag, as PGE must be enabled after PG.
|
// First clear PG and PGE flag, as PGE must be enabled after PG.
|
||||||
kernaux_arch_i386_write_cr0(cr0 & ~KERNAUX_ARCH_I386_CR0_PG);
|
kernaux_asm_i386_write_cr0(cr0 & ~KERNAUX_ARCH_I386_CR0_PG);
|
||||||
kernaux_arch_i386_write_cr4(cr4 & ~(KERNAUX_ARCH_I386_CR4_PGE | KERNAUX_ARCH_I386_CR4_PSE));
|
kernaux_asm_i386_write_cr4(cr4 & ~(KERNAUX_ARCH_I386_CR4_PGE | KERNAUX_ARCH_I386_CR4_PSE));
|
||||||
|
|
||||||
cr0 = kernaux_arch_i386_read_cr0();
|
cr0 = kernaux_asm_i386_read_cr0();
|
||||||
cr4 = kernaux_arch_i386_read_cr4();
|
cr4 = kernaux_asm_i386_read_cr4();
|
||||||
|
|
||||||
// Our page table contains 4MB entries.
|
// Our page table contains 4MB entries.
|
||||||
// cr4 |= KERNAUX_ARCH_I386_CR4_PSE;
|
// cr4 |= KERNAUX_ARCH_I386_CR4_PSE;
|
||||||
|
|
||||||
kernaux_arch_i386_write_cr4(cr4);
|
kernaux_asm_i386_write_cr4(cr4);
|
||||||
|
|
||||||
// First enable paging, then enable global page flag.
|
// First enable paging, then enable global page flag.
|
||||||
cr0 |= KERNAUX_ARCH_I386_CR0_PG;
|
cr0 |= KERNAUX_ARCH_I386_CR0_PG;
|
||||||
|
|
||||||
kernaux_arch_i386_write_cr0(cr0);
|
kernaux_asm_i386_write_cr0(cr0);
|
||||||
|
|
||||||
cr0 |= KERNAUX_ARCH_I386_CR0_WP;
|
cr0 |= KERNAUX_ARCH_I386_CR0_WP;
|
||||||
|
|
||||||
kernaux_arch_i386_write_cr0(cr0);
|
kernaux_asm_i386_write_cr0(cr0);
|
||||||
kernaux_arch_i386_write_cr4(cr4);
|
kernaux_asm_i386_write_cr4(cr4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void paging_clear(struct Paging *const paging)
|
void paging_clear(struct Paging *const paging)
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
#include "panic.h"
|
#include "panic.h"
|
||||||
|
|
||||||
#include <kernaux/arch/i386.h>
|
#include <kernaux/asm/i386.h>
|
||||||
#include <kernaux/console.h>
|
#include <kernaux/console.h>
|
||||||
|
|
||||||
void panic(const char *const s)
|
void panic(const char *const s)
|
||||||
{
|
{
|
||||||
kernaux_console_printf("[FAIL] panic: %s\n", s);
|
kernaux_console_printf("[FAIL] panic: %s\n", s);
|
||||||
kernaux_arch_i386_hang();
|
kernaux_asm_i386_hang();
|
||||||
}
|
}
|
||||||
|
|
||||||
void halt()
|
void halt()
|
||||||
|
@ -21,5 +21,5 @@ void kernaux_assert_fn(
|
||||||
) {
|
) {
|
||||||
kernaux_console_printf("[FAIL] assertion failed: %s:%u: \"%s\"\n",
|
kernaux_console_printf("[FAIL] assertion failed: %s:%u: \"%s\"\n",
|
||||||
file, line, str);
|
file, line, str);
|
||||||
kernaux_arch_i386_hang();
|
kernaux_asm_i386_hang();
|
||||||
}
|
}
|
||||||
|
|
54
kernel/pic.c
54
kernel/pic.c
|
@ -1,6 +1,6 @@
|
||||||
#include "pic.h"
|
#include "pic.h"
|
||||||
|
|
||||||
#include <kernaux/arch/i386.h>
|
#include <kernaux/asm/i386.h>
|
||||||
#include <kernaux/console.h>
|
#include <kernaux/console.h>
|
||||||
|
|
||||||
#define MASTER_COMMAND 0x20
|
#define MASTER_COMMAND 0x20
|
||||||
|
@ -19,16 +19,16 @@ void pic_enable_all()
|
||||||
{
|
{
|
||||||
kernaux_console_print("[INFO] pic: Enable all IRQs.\n");
|
kernaux_console_print("[INFO] pic: Enable all IRQs.\n");
|
||||||
|
|
||||||
kernaux_arch_i386_outportb(MASTER_DATA, 0);
|
kernaux_asm_i386_outportb(MASTER_DATA, 0);
|
||||||
kernaux_arch_i386_outportb(SLAVE_DATA, 0);
|
kernaux_asm_i386_outportb(SLAVE_DATA, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pic_disable_all()
|
void pic_disable_all()
|
||||||
{
|
{
|
||||||
kernaux_console_print("[INFO] pic: Disable all IRQs.\n");
|
kernaux_console_print("[INFO] pic: Disable all IRQs.\n");
|
||||||
|
|
||||||
kernaux_arch_i386_outportb(MASTER_DATA, 0xFF);
|
kernaux_asm_i386_outportb(MASTER_DATA, 0xFF);
|
||||||
kernaux_arch_i386_outportb(SLAVE_DATA, 0xFF);
|
kernaux_asm_i386_outportb(SLAVE_DATA, 0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pic_enable(const unsigned char line)
|
void pic_enable(const unsigned char line)
|
||||||
|
@ -41,12 +41,12 @@ void pic_enable(const unsigned char line)
|
||||||
kernaux_console_printf("[INFO] pic: Enable line %u.\n", line);
|
kernaux_console_printf("[INFO] pic: Enable line %u.\n", line);
|
||||||
|
|
||||||
if (line < IRQS_COUNT) {
|
if (line < IRQS_COUNT) {
|
||||||
const unsigned char mask = kernaux_arch_i386_inportb(MASTER_DATA);
|
const unsigned char mask = kernaux_asm_i386_inportb(MASTER_DATA);
|
||||||
kernaux_arch_i386_outportb(MASTER_DATA, mask & ~(1 << line));
|
kernaux_asm_i386_outportb(MASTER_DATA, mask & ~(1 << line));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const unsigned char mask = kernaux_arch_i386_inportb(SLAVE_DATA);
|
const unsigned char mask = kernaux_asm_i386_inportb(SLAVE_DATA);
|
||||||
kernaux_arch_i386_outportb(SLAVE_DATA, mask & ~(1 << (line - IRQS_COUNT)));
|
kernaux_asm_i386_outportb(SLAVE_DATA, mask & ~(1 << (line - IRQS_COUNT)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,12 +60,12 @@ void pic_disable(const unsigned char line)
|
||||||
kernaux_console_printf("[INFO] pic: Disable line %u.\n", line);
|
kernaux_console_printf("[INFO] pic: Disable line %u.\n", line);
|
||||||
|
|
||||||
if (line < IRQS_COUNT) {
|
if (line < IRQS_COUNT) {
|
||||||
const unsigned char mask = kernaux_arch_i386_inportb(MASTER_DATA);
|
const unsigned char mask = kernaux_asm_i386_inportb(MASTER_DATA);
|
||||||
kernaux_arch_i386_outportb(MASTER_DATA, mask | (1 << line));
|
kernaux_asm_i386_outportb(MASTER_DATA, mask | (1 << line));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const unsigned char mask = kernaux_arch_i386_inportb(SLAVE_DATA);
|
const unsigned char mask = kernaux_asm_i386_inportb(SLAVE_DATA);
|
||||||
kernaux_arch_i386_outportb(SLAVE_DATA, mask | (1 << (line - IRQS_COUNT)));
|
kernaux_asm_i386_outportb(SLAVE_DATA, mask | (1 << (line - IRQS_COUNT)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,28 +79,28 @@ void pic_remap(const unsigned char new_master_irq_start, const unsigned char new
|
||||||
slave_irq_start = new_slave_irq_start;
|
slave_irq_start = new_slave_irq_start;
|
||||||
|
|
||||||
// Save masks
|
// Save masks
|
||||||
unsigned char master_mask = kernaux_arch_i386_inportb(MASTER_DATA);
|
unsigned char master_mask = kernaux_asm_i386_inportb(MASTER_DATA);
|
||||||
unsigned char slave_mask = kernaux_arch_i386_inportb(SLAVE_DATA);
|
unsigned char slave_mask = kernaux_asm_i386_inportb(SLAVE_DATA);
|
||||||
|
|
||||||
// Start the initialization sequence
|
// Start the initialization sequence
|
||||||
kernaux_arch_i386_outportb(MASTER_COMMAND, 0x11);
|
kernaux_asm_i386_outportb(MASTER_COMMAND, 0x11);
|
||||||
kernaux_arch_i386_outportb(SLAVE_COMMAND, 0x11);
|
kernaux_asm_i386_outportb(SLAVE_COMMAND, 0x11);
|
||||||
|
|
||||||
// Set IRQ vectors
|
// Set IRQ vectors
|
||||||
kernaux_arch_i386_outportb(MASTER_DATA, new_master_irq_start);
|
kernaux_asm_i386_outportb(MASTER_DATA, new_master_irq_start);
|
||||||
kernaux_arch_i386_outportb(SLAVE_DATA, new_slave_irq_start);
|
kernaux_asm_i386_outportb(SLAVE_DATA, new_slave_irq_start);
|
||||||
|
|
||||||
// Connect master and slave with each other
|
// Connect master and slave with each other
|
||||||
kernaux_arch_i386_outportb(MASTER_DATA, 0x04);
|
kernaux_asm_i386_outportb(MASTER_DATA, 0x04);
|
||||||
kernaux_arch_i386_outportb(SLAVE_DATA, 0x02);
|
kernaux_asm_i386_outportb(SLAVE_DATA, 0x02);
|
||||||
|
|
||||||
// 8086/88 (MCS-80/85) mode
|
// 8086/88 (MCS-80/85) mode
|
||||||
kernaux_arch_i386_outportb(MASTER_DATA, 0x01);
|
kernaux_asm_i386_outportb(MASTER_DATA, 0x01);
|
||||||
kernaux_arch_i386_outportb(SLAVE_DATA, 0x01);
|
kernaux_asm_i386_outportb(SLAVE_DATA, 0x01);
|
||||||
|
|
||||||
// Restore masks
|
// Restore masks
|
||||||
kernaux_arch_i386_outportb(MASTER_DATA, master_mask);
|
kernaux_asm_i386_outportb(MASTER_DATA, master_mask);
|
||||||
kernaux_arch_i386_outportb(SLAVE_DATA, slave_mask);
|
kernaux_asm_i386_outportb(SLAVE_DATA, slave_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char pic_end_of_interrupt(const unsigned char irq)
|
unsigned char pic_end_of_interrupt(const unsigned char irq)
|
||||||
|
@ -113,10 +113,10 @@ unsigned char pic_end_of_interrupt(const unsigned char irq)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (to_slave) {
|
if (to_slave) {
|
||||||
kernaux_arch_i386_outportb(SLAVE_COMMAND, 0x20);
|
kernaux_asm_i386_outportb(SLAVE_COMMAND, 0x20);
|
||||||
}
|
}
|
||||||
|
|
||||||
kernaux_arch_i386_outportb(MASTER_COMMAND, 0x20);
|
kernaux_asm_i386_outportb(MASTER_COMMAND, 0x20);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
#include <kernaux/arch/i386.h>
|
#include <kernaux/asm/i386.h>
|
||||||
#include <kernaux/console.h>
|
#include <kernaux/console.h>
|
||||||
|
|
||||||
void timer_initialize(unsigned int frequency)
|
void timer_initialize(unsigned int frequency)
|
||||||
|
@ -12,9 +12,9 @@ void timer_initialize(unsigned int frequency)
|
||||||
const unsigned char l = divisor & 0xFF;
|
const unsigned char l = divisor & 0xFF;
|
||||||
const unsigned char h = (divisor >> 8) & 0xFF;
|
const unsigned char h = (divisor >> 8) & 0xFF;
|
||||||
|
|
||||||
kernaux_arch_i386_outportb(0x43, 0x36);
|
kernaux_asm_i386_outportb(0x43, 0x36);
|
||||||
kernaux_arch_i386_outportb(0x40, l);
|
kernaux_asm_i386_outportb(0x40, l);
|
||||||
kernaux_arch_i386_outportb(0x40, h);
|
kernaux_asm_i386_outportb(0x40, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
void timer_register_handler(timer_handler_t handler)
|
void timer_register_handler(timer_handler_t handler)
|
||||||
|
|
Loading…
Reference in a new issue