Utilities: Start moving utilities into specific headers in a utils/ subdirectory
This commit is contained in:
parent
9b3c7816a3
commit
e21b608af4
@ -5,8 +5,6 @@
|
||||
#define PAGE_SIZE 4096
|
||||
#endif
|
||||
|
||||
extern "C" uint64_t asm_get_rflags();
|
||||
|
||||
namespace Utilities
|
||||
{
|
||||
inline uint64_t get_blocks_from_size(uint64_t blocksize, uint64_t size)
|
||||
@ -14,11 +12,6 @@ namespace Utilities
|
||||
return (size + (blocksize - 1)) / blocksize;
|
||||
}
|
||||
|
||||
inline uint64_t get_rflags()
|
||||
{
|
||||
return asm_get_rflags();
|
||||
}
|
||||
|
||||
inline uint64_t get_top_of_stack(uint64_t bottom, uint64_t stack_pages)
|
||||
{
|
||||
return bottom + (stack_pages * PAGE_SIZE) - sizeof(uintptr_t);
|
||||
|
52
kernel/include/utils/Registers.h
Normal file
52
kernel/include/utils/Registers.h
Normal file
@ -0,0 +1,52 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
extern "C" uintptr_t asm_get_rflags();
|
||||
extern "C" void asm_set_rflags(uintptr_t);
|
||||
|
||||
inline uintptr_t read_rflags()
|
||||
{
|
||||
return asm_get_rflags();
|
||||
}
|
||||
|
||||
inline void write_rflags(uintptr_t value)
|
||||
{
|
||||
asm_set_rflags(value);
|
||||
}
|
||||
|
||||
inline uintptr_t read_cr0()
|
||||
{
|
||||
uintptr_t value;
|
||||
asm volatile("mov %%cr0, %0" : "=r"(value));
|
||||
return value;
|
||||
}
|
||||
|
||||
inline uintptr_t read_cr3()
|
||||
{
|
||||
uintptr_t value;
|
||||
asm volatile("mov %%cr3, %0" : "=r"(value));
|
||||
return value;
|
||||
}
|
||||
|
||||
inline uintptr_t read_cr4()
|
||||
{
|
||||
uintptr_t value;
|
||||
asm volatile("mov %%cr4, %0" : "=r"(value));
|
||||
return value;
|
||||
}
|
||||
|
||||
template <typename T> inline void write_cr0(T value)
|
||||
{
|
||||
asm volatile("mov %0, %%cr0" : : "r"(value));
|
||||
}
|
||||
|
||||
template <typename T> inline void write_cr3(T value)
|
||||
{
|
||||
asm volatile("mov %0, %%cr3" : : "r"(value));
|
||||
}
|
||||
|
||||
template <typename T> inline void write_cr4(T value)
|
||||
{
|
||||
asm volatile("mov %0, %%cr4" : : "r"(value));
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
#include "interrupts/Interrupts.h"
|
||||
#include "misc/utils.h"
|
||||
#include "trace/StackTracer.h"
|
||||
#include "utils/Registers.h"
|
||||
|
||||
void Interrupts::disable()
|
||||
{
|
||||
@ -29,7 +29,7 @@ void Interrupts::return_from_handler(Context* context)
|
||||
|
||||
bool Interrupts::are_enabled()
|
||||
{
|
||||
return (Utilities::get_rflags() & 0x200) > 0;
|
||||
return (read_rflags() & 0x200) > 0;
|
||||
}
|
||||
|
||||
static bool saved_interrupt_state;
|
||||
|
@ -31,4 +31,10 @@ global asm_get_rflags
|
||||
asm_get_rflags:
|
||||
pushfq
|
||||
pop rax
|
||||
ret
|
||||
|
||||
global asm_set_rflags
|
||||
asm_set_rflags:
|
||||
push rdi
|
||||
popfq
|
||||
ret
|
@ -6,6 +6,7 @@
|
||||
#include "memory/PMM.h"
|
||||
#include "misc/utils.h"
|
||||
#include "std/string.h"
|
||||
#include "utils/Registers.h"
|
||||
|
||||
static PageTable* kernel_pml4;
|
||||
static PageTable* current_pml4;
|
||||
@ -55,8 +56,7 @@ bool VMM::is_using_kernel_address_space()
|
||||
|
||||
void VMM::init()
|
||||
{
|
||||
asm volatile("mov %%cr3, %0" : "=r"(current_pml4));
|
||||
kernel_pml4 = current_pml4;
|
||||
kernel_pml4 = (PageTable*)read_cr3();
|
||||
}
|
||||
|
||||
void VMM::unmap(uint64_t vaddr)
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "sys/elf/ELFLoader.h"
|
||||
#include "thread/PIT.h"
|
||||
#include "thread/Task.h"
|
||||
#include "utils/Registers.h"
|
||||
|
||||
static uint64_t task_num = 0;
|
||||
|
||||
@ -70,7 +71,7 @@ void Scheduler::add_kernel_task(void (*task)(void))
|
||||
new_task->regs.cs = 0x08;
|
||||
new_task->regs.ss = 0x10;
|
||||
new_task->regs.ds = 0x10;
|
||||
new_task->regs.rflags = Utilities::get_rflags() | 0x200; // enable interrupts
|
||||
new_task->regs.rflags = read_rflags() | 0x200; // enable interrupts
|
||||
new_task->task_sleep = 0;
|
||||
new_task->task_time = 0;
|
||||
new_task->cpu_time = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user