Fixed formatting in mmgr.c
This commit is contained in:
@@ -12,71 +12,73 @@ struct page_table_entry_t
|
|||||||
{
|
{
|
||||||
uint32_t present : 1;
|
uint32_t present : 1;
|
||||||
|
|
||||||
uint32_t rw : 1;
|
uint32_t rw : 1;
|
||||||
|
|
||||||
uint32_t usermode : 1;
|
uint32_t usermode : 1;
|
||||||
|
|
||||||
uint32_t writeThrough : 1;
|
uint32_t writeThrough : 1;
|
||||||
|
|
||||||
uint32_t cacheDisable : 1;
|
uint32_t cacheDisable : 1;
|
||||||
|
|
||||||
uint32_t accessed : 1;
|
uint32_t accessed : 1;
|
||||||
|
|
||||||
uint32_t dirty : 1;
|
uint32_t dirty : 1;
|
||||||
|
|
||||||
uint32_t pat : 1;
|
uint32_t pat : 1;
|
||||||
|
|
||||||
uint32_t global : 1;
|
uint32_t global : 1;
|
||||||
|
|
||||||
uint32_t shared : 1;
|
uint32_t shared : 1;
|
||||||
|
|
||||||
uint32_t ignored : 2;
|
uint32_t ignored : 2;
|
||||||
|
|
||||||
uint32_t physicalAddress : 20;
|
uint32_t physicalAddress : 20;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct page_table_entry_t *page_tables = (struct page_table_entry_t*) 0xFFC00000;
|
struct page_table_entry_t *page_tables = (struct page_table_entry_t *)0xFFC00000;
|
||||||
|
|
||||||
struct page_table_entry_t *page_directory = (struct page_table_entry_t*) 0xFFFFF000;
|
struct page_table_entry_t *page_directory = (struct page_table_entry_t *)0xFFFFF000;
|
||||||
|
|
||||||
physaddr_t create_address_space(struct page_stack_t *page_stack)
|
physaddr_t create_address_space(struct page_stack_t *page_stack)
|
||||||
{
|
{
|
||||||
physaddr_t table = reserve_page(page_stack);
|
physaddr_t table = reserve_page(page_stack);
|
||||||
if(table == S_OUT_OF_MEMORY)
|
if (table == S_OUT_OF_MEMORY)
|
||||||
{
|
{
|
||||||
return S_OUT_OF_MEMORY;
|
return S_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
struct page_table_entry_t buffer = page_directory[0];
|
struct page_table_entry_t buffer = page_directory[0];
|
||||||
page_directory[0] = table;
|
page_directory[0] = table;
|
||||||
asm volatile("invlpg $0xFFC00000" ::: "memory");
|
asm volatile("invlpg $0xFFC00000" ::
|
||||||
memset((void*) page_tables, 0, 1022 * 4);
|
: "memory");
|
||||||
|
memset((void *)page_tables, 0, 1022 * 4);
|
||||||
page_tables[1022] = page_directory[1022];
|
page_tables[1022] = page_directory[1022];
|
||||||
page_tables[1023] = page_directory[1023];
|
page_tables[1023] = page_directory[1023];
|
||||||
page_directory[0] = buffer;
|
page_directory[0] = buffer;
|
||||||
asm volatile("invlpg $0xFFC00000" ::: "memory");
|
asm volatile("invlpg $0xFFC00000" ::
|
||||||
|
: "memory");
|
||||||
return table;
|
return table;
|
||||||
}
|
}
|
||||||
|
|
||||||
void load_address_space(physaddr_t table)
|
void load_address_space(physaddr_t table)
|
||||||
{
|
{
|
||||||
asm volatile("mov %0, %%cr3"
|
asm volatile("mov %0, %%cr3"
|
||||||
:
|
:
|
||||||
: "r" (table)
|
: "r"(table)
|
||||||
: "memory");
|
: "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
int map_page(struct page_stack_t *page_stack, void *page, physaddr_t frame, int flags)
|
int map_page(struct page_stack_t *page_stack, void *page, physaddr_t frame, int flags)
|
||||||
{
|
{
|
||||||
if((size_t) page % page_size != 0 || frame % page_size != 0)
|
if ((size_t)page % page_size != 0 || frame % page_size != 0)
|
||||||
{
|
{
|
||||||
return S_OUT_OF_BOUNDS;
|
return S_OUT_OF_BOUNDS;
|
||||||
}
|
}
|
||||||
size_t table_index = (size_t) page / page_size;
|
size_t table_index = (size_t)page / page_size;
|
||||||
size_t directory_index = table_index / (page_size / sizeof(struct page_table_entry_t));
|
size_t directory_index = table_index / (page_size / sizeof(struct page_table_entry_t));
|
||||||
if(!page_directory[directory_index].present)
|
if (!page_directory[directory_index].present)
|
||||||
{
|
{
|
||||||
physaddr_t new_table = reserve_page(page_stack);
|
physaddr_t new_table = reserve_page(page_stack);
|
||||||
if(new_table == S_OUT_OF_MEMORY)
|
if (new_table == S_OUT_OF_MEMORY)
|
||||||
{
|
{
|
||||||
return S_OUT_OF_MEMORY;
|
return S_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
@@ -90,21 +92,21 @@ int map_page(struct page_stack_t *page_stack, void *page, physaddr_t frame, int
|
|||||||
page_tables[table_index].usermode = 1;
|
page_tables[table_index].usermode = 1;
|
||||||
page_tables[table_index].rw = 1;
|
page_tables[table_index].rw = 1;
|
||||||
asm volatile("invlpg (%0)"
|
asm volatile("invlpg (%0)"
|
||||||
:
|
:
|
||||||
: "r" (page)
|
: "r"(page)
|
||||||
: "memory");
|
: "memory");
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
physaddr_t unmap_page(void *page)
|
physaddr_t unmap_page(void *page)
|
||||||
{
|
{
|
||||||
if((size_t) page % page_size != 0)
|
if ((size_t)page % page_size != 0)
|
||||||
{
|
{
|
||||||
return S_OUT_OF_BOUNDS;
|
return S_OUT_OF_BOUNDS;
|
||||||
}
|
}
|
||||||
size_t table_index = (size_t) page / page_size;
|
size_t table_index = (size_t)page / page_size;
|
||||||
size_t directory_index = table_index / (page_size / sizeof(struct page_table_entry_t));
|
size_t directory_index = table_index / (page_size / sizeof(struct page_table_entry_t));
|
||||||
if(!page_directory[directory_index].present || !page_tables[table_index].present)
|
if (!page_directory[directory_index].present || !page_tables[table_index].present)
|
||||||
{
|
{
|
||||||
return S_OUT_OF_BOUNDS;
|
return S_OUT_OF_BOUNDS;
|
||||||
}
|
}
|
||||||
@@ -113,9 +115,9 @@ physaddr_t unmap_page(void *page)
|
|||||||
physaddr_t frame = page_tables[table_index].physicalAddress << page_bits;
|
physaddr_t frame = page_tables[table_index].physicalAddress << page_bits;
|
||||||
memset(&page_tables[table_index], 0, sizeof(struct page_table_entry_t));
|
memset(&page_tables[table_index], 0, sizeof(struct page_table_entry_t));
|
||||||
asm volatile("invlpg (%0)"
|
asm volatile("invlpg (%0)"
|
||||||
:
|
:
|
||||||
: "r" (page)
|
: "r"(page)
|
||||||
: "memory");
|
: "memory");
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user