Compare commits
4 Commits
de0b8cd37a
...
672f77d12e
| Author | SHA1 | Date |
|---|---|---|
|
|
672f77d12e | |
|
|
ebb9dffd0a | |
|
|
eab460e5d9 | |
|
|
176261bdcc |
|
|
@ -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){
|
||||
|
|
|
|||
Loading…
Reference in New Issue