mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-16 16:11:42 -04:00
Try safety
This commit is contained in:
parent
5fec55ce89
commit
6ecab3fb1a
@ -15,6 +15,7 @@
|
|||||||
#include "process.hpp"
|
#include "process.hpp"
|
||||||
#include "physical_pointer.hpp"
|
#include "physical_pointer.hpp"
|
||||||
#include "kernel_utils.hpp"
|
#include "kernel_utils.hpp"
|
||||||
|
#include "int_lock.hpp"
|
||||||
|
|
||||||
#include "fs/sysfs.hpp"
|
#include "fs/sysfs.hpp"
|
||||||
|
|
||||||
@ -97,6 +98,13 @@ size_t early_map_page_clear(size_t physical){
|
|||||||
return virt;
|
return virt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clear_physical_page(size_t physical){
|
||||||
|
physical_pointer ptr(physical, 1);
|
||||||
|
|
||||||
|
auto it = ptr.as_ptr<uint64_t>();
|
||||||
|
std::fill_n(it, paging::PAGE_SIZE / sizeof(uint64_t), 0);
|
||||||
|
}
|
||||||
|
|
||||||
} //end of anonymous namespace
|
} //end of anonymous namespace
|
||||||
|
|
||||||
void paging::init(){
|
void paging::init(){
|
||||||
@ -262,6 +270,8 @@ bool paging::page_free_or_set(size_t virt, size_t physical){
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool paging::map(size_t virt, size_t physical, uint8_t flags){
|
bool paging::map(size_t virt, size_t physical, uint8_t flags){
|
||||||
|
int_lock lock;
|
||||||
|
|
||||||
//The address must be page-aligned
|
//The address must be page-aligned
|
||||||
if(!page_aligned(virt)){
|
if(!page_aligned(virt)){
|
||||||
return false;
|
return false;
|
||||||
@ -301,6 +311,8 @@ bool paging::map(size_t virt, size_t physical, uint8_t flags){
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool paging::map_pages(size_t virt, size_t physical, size_t pages, uint8_t flags){
|
bool paging::map_pages(size_t virt, size_t physical, size_t pages, uint8_t flags){
|
||||||
|
int_lock lock;
|
||||||
|
|
||||||
//The address must be page-aligned
|
//The address must be page-aligned
|
||||||
if(!page_aligned(virt)){
|
if(!page_aligned(virt)){
|
||||||
return false;
|
return false;
|
||||||
@ -331,6 +343,8 @@ bool paging::map_pages(size_t virt, size_t physical, size_t pages, uint8_t flags
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool paging::unmap(size_t virt){
|
bool paging::unmap(size_t virt){
|
||||||
|
int_lock lock;
|
||||||
|
|
||||||
//The address must be page-aligned
|
//The address must be page-aligned
|
||||||
if(!page_aligned(virt)){
|
if(!page_aligned(virt)){
|
||||||
return false;
|
return false;
|
||||||
@ -375,6 +389,8 @@ bool paging::unmap(size_t virt){
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool paging::unmap_pages(size_t virt, size_t pages){
|
bool paging::unmap_pages(size_t virt, size_t pages){
|
||||||
|
int_lock lock;
|
||||||
|
|
||||||
//The address must be page-aligned
|
//The address must be page-aligned
|
||||||
if(!page_aligned(virt)){
|
if(!page_aligned(virt)){
|
||||||
return false;
|
return false;
|
||||||
@ -399,7 +415,10 @@ bool paging::identity_map(size_t virt, uint8_t flags){
|
|||||||
bool paging::identity_map_pages(size_t virt, size_t pages, uint8_t flags){
|
bool paging::identity_map_pages(size_t virt, size_t pages, uint8_t flags){
|
||||||
return map_pages(virt, virt, pages, flags);
|
return map_pages(virt, virt, pages, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void paging::map_kernel_inside_user(scheduler::process_t& process){
|
void paging::map_kernel_inside_user(scheduler::process_t& process){
|
||||||
|
int_lock lock;
|
||||||
|
|
||||||
physical_pointer cr3_ptr(process.physical_cr3, 1);
|
physical_pointer cr3_ptr(process.physical_cr3, 1);
|
||||||
|
|
||||||
//As we are ensuring that the first PML4T entries are reserved to the
|
//As we are ensuring that the first PML4T entries are reserved to the
|
||||||
@ -411,15 +430,10 @@ void paging::map_kernel_inside_user(scheduler::process_t& process){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear_physical_page(size_t physical){
|
|
||||||
physical_pointer ptr(physical, 1);
|
|
||||||
|
|
||||||
auto it = ptr.as_ptr<uint64_t>();
|
|
||||||
std::fill_n(it, paging::PAGE_SIZE / sizeof(uint64_t), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO It is highly inefficient to remap CR3 each time
|
//TODO It is highly inefficient to remap CR3 each time
|
||||||
bool paging::user_map(scheduler::process_t& process, size_t virt, size_t physical){
|
bool paging::user_map(scheduler::process_t& process, size_t virt, size_t physical){
|
||||||
|
int_lock lock;
|
||||||
|
|
||||||
physical_pointer cr3_ptr(process.physical_cr3, 1);
|
physical_pointer cr3_ptr(process.physical_cr3, 1);
|
||||||
|
|
||||||
if(!cr3_ptr){
|
if(!cr3_ptr){
|
||||||
@ -498,6 +512,8 @@ bool paging::user_map(scheduler::process_t& process, size_t virt, size_t physica
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool paging::user_map_pages(scheduler::process_t& process, size_t virt, size_t physical, size_t pages){
|
bool paging::user_map_pages(scheduler::process_t& process, size_t virt, size_t physical, size_t pages){
|
||||||
|
int_lock lock;
|
||||||
|
|
||||||
//Map each page
|
//Map each page
|
||||||
for(size_t page = 0; page < pages; ++page){
|
for(size_t page = 0; page < pages; ++page){
|
||||||
auto virt_addr = virt + page * PAGE_SIZE;
|
auto virt_addr = virt + page * PAGE_SIZE;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user