Added support for page types in mmgr
This commit is contained in:
@@ -10,6 +10,13 @@ enum page_flag_t
|
|||||||
PAGE_USERMODE = 1 << 2
|
PAGE_USERMODE = 1 << 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum page_type_t
|
||||||
|
{
|
||||||
|
PAGE_NOT_PRESENT = 0,
|
||||||
|
PAGE_ANON = 1,
|
||||||
|
PAGE_COPY_ON_WRITE = 2
|
||||||
|
};
|
||||||
|
|
||||||
extern const size_t page_size;
|
extern const size_t page_size;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -55,3 +62,11 @@ int map_page(struct page_stack_t *page_stack, void *page, physaddr_t frame, int
|
|||||||
* @return physaddr_t
|
* @return physaddr_t
|
||||||
*/
|
*/
|
||||||
physaddr_t unmap_page(void *page);
|
physaddr_t unmap_page(void *page);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
*
|
||||||
|
* @param page
|
||||||
|
* @return enum page_type_t
|
||||||
|
*/
|
||||||
|
enum page_type_t page_type(void *page);
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ struct page_table_entry_t
|
|||||||
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 type : 2;
|
||||||
uint32_t physical_address : 20;
|
uint32_t physical_address : 20;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ int start_paging(physaddr_t start, physaddr_t end, uint32_t *directory, uint32_t
|
|||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
directory[0] = ((uint32_t)identity_table) + 3;
|
directory[0] = ((uint32_t)identity_table) + 3;
|
||||||
directory[1022] = ((uint32_t)table) + 3;
|
directory[1022] = ((uint32_t)table) + 3 + 1024;
|
||||||
directory[1023] = ((uint32_t)directory) + 3;
|
directory[1023] = ((uint32_t)directory) + 3;
|
||||||
asm("mov %0, %%cr3"
|
asm("mov %0, %%cr3"
|
||||||
:
|
:
|
||||||
@@ -115,6 +115,7 @@ int map_page(struct page_stack_t *page_stack, void *page, physaddr_t frame, int
|
|||||||
page_tables[table_index].present = 1;
|
page_tables[table_index].present = 1;
|
||||||
page_tables[table_index].usermode = (flags & PAGE_USERMODE) ? 1 : 0;
|
page_tables[table_index].usermode = (flags & PAGE_USERMODE) ? 1 : 0;
|
||||||
page_tables[table_index].rw = (flags & PAGE_RW) ? 1 : 0;
|
page_tables[table_index].rw = (flags & PAGE_RW) ? 1 : 0;
|
||||||
|
page_tables[table_index].type = PAGE_ANON;
|
||||||
asm volatile("invlpg (%0)"
|
asm volatile("invlpg (%0)"
|
||||||
:
|
:
|
||||||
: "r"(page)
|
: "r"(page)
|
||||||
@@ -126,7 +127,7 @@ 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_INVALID_ARGUMENT;
|
||||||
}
|
}
|
||||||
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));
|
||||||
@@ -145,3 +146,17 @@ physaddr_t unmap_page(void *page)
|
|||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum page_type_t page_type(void *page)
|
||||||
|
{
|
||||||
|
size_t table_index = (size_t)page / page_size;
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
return PAGE_NOT_PRESENT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return page_tables[table_index].type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user