GitOS
Operating system exercise
Loading...
Searching...
No Matches
paging.c File Reference
#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_chunkpaging_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.
 

Function Documentation

◆ paging_align_address()

void * paging_align_address ( void *  ptr)

Aligns pointer to page size.

Parameters
ptr
Returns
void*

References PAGING_PAGE_SIZE.

◆ paging_align_address_to_lower_page()

void * paging_align_address_to_lower_page ( void *  ptr)

References PAGING_PAGE_SIZE.

◆ paging_free_directory()

void paging_free_directory ( struct paging_chunk chunk)

Frees all entries and page directory itself.

Parameters
chunkPage directory to free

References paging_chunk::directory_entry, and kfree().

◆ paging_get_directory()

uint32_t * paging_get_directory ( struct paging_chunk chunk)

Returns directory entry pointer for given chunk.

Parameters
chunkChunk
Returns
uint32_t* Page directory pointer

References paging_chunk::directory_entry.

◆ paging_get_page()

uint32_t paging_get_page ( uint32_t *  directory,
void *  virtual_address 
)

References EINVARG.

◆ paging_map()

int paging_map ( struct paging_chunk chunk,
void *  virtual,
void *  physical,
int  flags 
)

Maps virtual address to physical in page directory.

Parameters
chunkPaging chunk
physicalPhysical address
flagsPage directory entry flags
Returns
int Error code

References paging_chunk::directory_entry, EINVARG, flags, PAGING_PAGE_SIZE, and paging_set_page().

◆ paging_map_range()

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.

Parameters
directoryPage directory
physicalPhysical address
flagsPage directory entry flags
countCount of entries
Returns
int Error code

References flags, paging_map(), and PAGING_PAGE_SIZE.

◆ paging_map_to()

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.

Parameters
chunkPaging chunk
physical_addressPhysical address start
physical_endPhysical address end
flagsPage directory entry flags
Returns
int Error code

References EINVARG, flags, paging_map_range(), and PAGING_PAGE_SIZE.

◆ paging_new_directory()

struct paging_chunk * paging_new_directory ( uint8_t  flags)

Allocates and creates new page directory with specified flags.

Parameters
flagsFlags for each page table
Returns
paging_chunk* Pointer to new paging chunk

References paging_chunk::directory_entry, flags, kzalloc(), offset, PAGING_IS_WRITEABLE, PAGING_PAGE_SIZE, and PAGING_TOTAL_ENTRIES_PER_TABLE.

◆ paging_set_page()

int paging_set_page ( uint32_t *  directory,
void *  virtual_address,
uint32_t  value 
)

Sets page table entry.

Parameters
directoryPage directory pointer
virtual_addressVirtual address
valueValue for page table entry
Returns
int Status

References EINVARG.

◆ paging_switch()

void paging_switch ( struct paging_chunk chunk)

Switches to given page directory pointer.

Parameters
chunkPage directory pointer

References paging_chunk::directory_entry.