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 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){
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue