GitOS
Operating system exercise
|
#include "paging.h"
#include <stdint.h>
#include <stdbool.h>
#include "memory/heap/kheap.h"
#include "common/status.h"
Functions | |
uint32_t * | paging_get_directory (struct paging_chunk *chunk) |
Returns directory entry pointer for given chunk. | |
struct paging_chunk * | paging_new_directory (uint8_t flags) |
Allocates and creates new page directory with specified flags. | |
void | paging_free_directory (struct paging_chunk *chunk) |
Frees all entries and page directory itself. | |
void | paging_switch (struct paging_chunk *chunk) |
Switches to given page directory pointer. | |
int | paging_set_page (uint32_t *directory, void *virtual_address, uint32_t value) |
Sets page table entry. | |
uint32_t | paging_get_page (uint32_t *directory, void *virtual_address) |
void * | paging_align_address (void *ptr) |
Aligns pointer to page size. | |
void * | paging_align_address_to_lower_page (void *ptr) |
int | paging_map (struct paging_chunk *chunk, void *virtual, void *physical, int flags) |
Maps virtual address to physical in page directory. | |
int | paging_map_range (struct paging_chunk *directory, void *virtual, void *physical, int count, int flags) |
Maps range of virtual addresses to physical in page directory. | |
int | paging_map_to (struct paging_chunk *chunk, void *virtual_address, void *physical_address, void *physical_end, int flags) |
Maps virtual address to physical in page directory. | |
void * paging_align_address | ( | void * | ptr | ) |
void * paging_align_address_to_lower_page | ( | void * | ptr | ) |
References PAGING_PAGE_SIZE.
void paging_free_directory | ( | struct paging_chunk * | chunk | ) |
Frees all entries and page directory itself.
chunk | Page directory to free |
References paging_chunk::directory_entry, and kfree().
uint32_t * paging_get_directory | ( | struct paging_chunk * | chunk | ) |
Returns directory entry pointer for given chunk.
chunk | Chunk |
References paging_chunk::directory_entry.
uint32_t paging_get_page | ( | uint32_t * | directory, |
void * | virtual_address | ||
) |
References EINVARG.
int paging_map | ( | struct paging_chunk * | chunk, |
void * | virtual, | ||
void * | physical, | ||
int | flags | ||
) |
Maps virtual address to physical in page directory.
chunk | Paging chunk |
physical | Physical address |
flags | Page directory entry flags |
References paging_chunk::directory_entry, EINVARG, flags, PAGING_PAGE_SIZE, and paging_set_page().
int paging_map_range | ( | struct paging_chunk * | directory, |
void * | virtual, | ||
void * | physical, | ||
int | count, | ||
int | flags | ||
) |
Maps range of virtual addresses to physical in page directory.
directory | Page directory |
physical | Physical address |
flags | Page directory entry flags |
count | Count of entries |
References flags, paging_map(), and PAGING_PAGE_SIZE.
int paging_map_to | ( | struct paging_chunk * | chunk, |
void * | virtual_address, | ||
void * | physical_address, | ||
void * | physical_end, | ||
int | flags | ||
) |
Maps virtual address to physical in page directory.
chunk | Paging chunk |
physical_address | Physical address start |
physical_end | Physical address end |
flags | Page directory entry flags |
References EINVARG, flags, paging_map_range(), and PAGING_PAGE_SIZE.
struct paging_chunk * paging_new_directory | ( | uint8_t | flags | ) |
Allocates and creates new page directory with specified flags.
flags | Flags for each page table |
References paging_chunk::directory_entry, flags, kzalloc(), offset, PAGING_IS_WRITEABLE, PAGING_PAGE_SIZE, and PAGING_TOTAL_ENTRIES_PER_TABLE.
int paging_set_page | ( | uint32_t * | directory, |
void * | virtual_address, | ||
uint32_t | value | ||
) |
Sets page table entry.
directory | Page directory pointer |
virtual_address | Virtual address |
value | Value for page table entry |
References EINVARG.
void paging_switch | ( | struct paging_chunk * | chunk | ) |
Switches to given page directory pointer.
chunk | Page directory pointer |
References paging_chunk::directory_entry.