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 pm_alloc(){
asm("cli");
for(uint32_t i = 0; i < mmap_count; i++){
for(int j = 0; j < 8; 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){
asm("cli");
for(uint32_t i = 0; i < 2; i++){
for(int j = 0; j < 8; j++){
// if(!(pm_map[i] & (1 << j))){
@ -33,8 +37,10 @@ uint32_t pm_alloc_index(uint32_t index){
}
}
return (index << 3) << 12;
asm("sti");
}
uint32_t pm_alloc_64kaligned(){
asm("cli");
uint32_t cont = 0;
uint32_t current = 0;
for(uint32_t i = 0; i < mmap_count; i++){
@ -56,6 +62,8 @@ uint32_t pm_alloc_64kaligned(){
current = i;
cont++;
}
return 0;
asm("sti");
}
void pm_free(uint32_t address){
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);
for(uint32_t i = 0; i < kernel_info->mmap_entry_count; i++){
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;
}
// 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){
asm("cli");
uint32_t pd_index = (uint32_t)vaddr >> 22;
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);
pt[pt_index] = (uint32_t)paddr | flags;
asm volatile("invlpg (%0) " : : "b"(vaddr) : "memory");
asm("sti");
}
void unmap(void *vaddr){
uint32_t pd_index = (uint32_t)vaddr >> 22;
@ -172,8 +182,10 @@ void *get_new_page(uint32_t flags){
i++;
}
map((void *)paddr+(i*4096), (void *)paddr, flags);
return (void *)(paddr+i*4096);
}
void *kmalloc(uint32_t size_pgs){
asm("cli");
uint32_t i = 0xc0000000 >> 12; //4mb/4096 (start search at 1mb line)
while(i < (1 << 22)){
uint8_t found = 1;
@ -192,8 +204,10 @@ void *kmalloc(uint32_t size_pgs){
uint32_t physaddr = pm_alloc();
map((void *)((i + j) << 12), (void*)physaddr, flags);
}
asm("sti");
return (void*)(i << 12);
}
asm("sti");
return 0;
}
void *kmalloc_page_paddr(uint32_t paddr, uint32_t size_pgs){