Compare commits

...

4 Commits

Author SHA1 Message Date
notsomeidiot123 672f77d12e Fix potential index-out-of-bounds in pm_init() 2026-07-04 11:52:13 -04:00
notsomeidiot123 ebb9dffd0a get_new_page actually returns a value like it should 2026-07-04 01:43:45 -04:00
notsomeidiot123 eab460e5d9 would you believe it? 2026-07-04 01:42:03 -04:00
notsomeidiot123 176261bdcc more preempting stuf 2026-07-04 01:21:59 -04:00
1 changed files with 15 additions and 1 deletions

View File

@ -15,6 +15,7 @@ mmap_entry_t mmap;
uint32_t mmap_entry_c; uint32_t mmap_entry_c;
uint32_t pm_alloc(){ uint32_t pm_alloc(){
asm("cli");
for(uint32_t i = 0; i < mmap_count; i++){ for(uint32_t i = 0; i < mmap_count; i++){
for(int j = 0; j < 8; j++){ for(int j = 0; j < 8; j++){
if(!(pm_map[i] & (1 << j))){ if(!(pm_map[i] & (1 << j))){
@ -23,8 +24,11 @@ uint32_t pm_alloc(){
} }
} }
} }
return 0;
asm("sti");
} }
uint32_t pm_alloc_index(uint32_t index){ uint32_t pm_alloc_index(uint32_t index){
asm("cli");
for(uint32_t i = 0; i < 2; i++){ for(uint32_t i = 0; i < 2; i++){
for(int j = 0; j < 8; j++){ for(int j = 0; j < 8; j++){
// if(!(pm_map[i] & (1 << j))){ // if(!(pm_map[i] & (1 << j))){
@ -33,8 +37,10 @@ uint32_t pm_alloc_index(uint32_t index){
} }
} }
return (index << 3) << 12; return (index << 3) << 12;
asm("sti");
} }
uint32_t pm_alloc_64kaligned(){ uint32_t pm_alloc_64kaligned(){
asm("cli");
uint32_t cont = 0; uint32_t cont = 0;
uint32_t current = 0; uint32_t current = 0;
for(uint32_t i = 0; i < mmap_count; i++){ for(uint32_t i = 0; i < mmap_count; i++){
@ -56,6 +62,8 @@ uint32_t pm_alloc_64kaligned(){
current = i; current = i;
cont++; cont++;
} }
return 0;
asm("sti");
} }
void pm_free(uint32_t address){ void pm_free(uint32_t address){
pm_map[address >> 15] &= ~(1 << ((address>>12) & 7)); pm_map[address >> 15] &= ~(1 << ((address>>12) & 7));
@ -72,7 +80,7 @@ int pm_init(kernel_info_t *kernel_info){
// mlog("KERNEL", " BASE | LENGTH | TYPE\n --------|--------|----\n", MLOG_PRINT); // mlog("KERNEL", " BASE | LENGTH | TYPE\n --------|--------|----\n", MLOG_PRINT);
for(uint32_t i = 0; i < kernel_info->mmap_entry_count; i++){ for(uint32_t i = 0; i < kernel_info->mmap_entry_count; i++){
for(uint32_t j = 0; j < (mmap[i].entry_length >> 12); j++){ for(uint32_t j = 0; j < (mmap[i].entry_length >> 12); j++){
if(mmap[i].entry_base + (j << 12) <= mmap[i-1].entry_base + mmap[i-1].entry_length){ if(i != 0 && mmap[i].entry_base + (j << 12) <= mmap[i-1].entry_base + mmap[i-1].entry_length){
continue; continue;
} }
// printf("j = %d\nIndex:%x\n", j, (mmap[i].entry_base >> 12) + (j & 3)); // printf("j = %d\nIndex:%x\n", j, (mmap[i].entry_base >> 12) + (j & 3));
@ -106,6 +114,7 @@ int pm_init(kernel_info_t *kernel_info){
} }
} }
void map(void *vaddr, void *paddr, uint32_t flags){ void map(void *vaddr, void *paddr, uint32_t flags){
asm("cli");
uint32_t pd_index = (uint32_t)vaddr >> 22; uint32_t pd_index = (uint32_t)vaddr >> 22;
uint32_t pt_index = (uint32_t)vaddr >> 12 & 0x3ff; uint32_t pt_index = (uint32_t)vaddr >> 12 & 0x3ff;
@ -121,6 +130,7 @@ void map(void *vaddr, void *paddr, uint32_t flags){
// printf("%x %x\n", vaddr, paddr); // printf("%x %x\n", vaddr, paddr);
pt[pt_index] = (uint32_t)paddr | flags; pt[pt_index] = (uint32_t)paddr | flags;
asm volatile("invlpg (%0) " : : "b"(vaddr) : "memory"); asm volatile("invlpg (%0) " : : "b"(vaddr) : "memory");
asm("sti");
} }
void unmap(void *vaddr){ void unmap(void *vaddr){
uint32_t pd_index = (uint32_t)vaddr >> 22; uint32_t pd_index = (uint32_t)vaddr >> 22;
@ -172,8 +182,10 @@ void *get_new_page(uint32_t flags){
i++; i++;
} }
map((void *)paddr+(i*4096), (void *)paddr, flags); map((void *)paddr+(i*4096), (void *)paddr, flags);
return (void *)(paddr+i*4096);
} }
void *kmalloc(uint32_t size_pgs){ void *kmalloc(uint32_t size_pgs){
asm("cli");
uint32_t i = 0xc0000000 >> 12; //4mb/4096 (start search at 1mb line) uint32_t i = 0xc0000000 >> 12; //4mb/4096 (start search at 1mb line)
while(i < (1 << 22)){ while(i < (1 << 22)){
uint8_t found = 1; uint8_t found = 1;
@ -192,8 +204,10 @@ void *kmalloc(uint32_t size_pgs){
uint32_t physaddr = pm_alloc(); uint32_t physaddr = pm_alloc();
map((void *)((i + j) << 12), (void*)physaddr, flags); map((void *)((i + j) << 12), (void*)physaddr, flags);
} }
asm("sti");
return (void*)(i << 12); return (void*)(i << 12);
} }
asm("sti");
return 0; return 0;
} }
void *kmalloc_page_paddr(uint32_t paddr, uint32_t size_pgs){ void *kmalloc_page_paddr(uint32_t paddr, uint32_t size_pgs){