Pip
Architecture-dependent parts of Pip: MAL, IAL and boot
|
#include <stdint.h>
#include "structures.h"
#include "periph.h"
#include "maldefines.h"
#include "mal.h"
#include "coproc.h"
Functions | |
void | ial_resume_ctx (user_ctx_t *context) __attribute__((noreturn)) |
void | enable_paging () |
enables paging More... | |
void | disable_paging () |
disables paging More... | |
void | writePhysical (uint32_t table, uint32_t index, uint32_t val) |
Stores the given address into the given indirection table, at the given index, with physical addresses. More... | |
uint32_t | readPhysicalNoFlags (uint32_t table, uint32_t index) |
Reads the address stored into table table, at index index, using physical addresses. This function masks the least significant bits that are used by the kernel to store various flags (see readVirEntry and readPhyEntry in model) More... | |
uint32_t | getTableSize () |
Gets size of indirection table. More... | |
uint32_t | getIndexOfAddr (uint32_t addr, uint32_t index) |
Gets the index of this address into the given indirection table level. More... | |
uint32_t | readAccessible (uint32_t table, uint32_t index) |
Gets the Accessible flag from the given entry. More... | |
void | writeAccessible (uint32_t table, uint32_t index, uint32_t value) |
Marks a page as accessible or not. More... | |
uint32_t | getCurPartition (void) |
get the current page directory More... | |
void | updateCurPartition (uint32_t descriptor) |
Set current partition paddr. More... | |
uint32_t | getRootPartition (void) |
get the root partition More... | |
void | updateRootPartition (uint32_t partition) |
Set root partition paddr. More... | |
uint32_t | readPresent (uint32_t table, uint32_t index) |
Gets the Present flag from the given entry. More... | |
void | writePDflag (uint32_t table, uint32_t index, uint32_t value) |
Writes the Page Directory flag into a shadow table. More... | |
uint32_t | readPDflag (uint32_t table, uint32_t index) |
Reads the Page Directory flag into a shadow table. More... | |
uint32_t | readPhysical (uint32_t table, uint32_t index) |
TODO. More... | |
void | writePhysicalNoFlags (uint32_t table, uint32_t index, uint32_t addr) |
TODO. More... | |
uint32_t | getNbIndex (void) |
Gets the amount of indirection tables. More... | |
uint32_t | readTableVirtual (uint32_t table, uint32_t index) |
Reads the address stored into table Table, at index index. More... | |
uint32_t | checkRights (uint32_t read, uint32_t write, uint32_t execute) |
Checks whether we can apply the given rights on the target architecture. More... | |
void | writeKernelPhysicalEntry (uint32_t child_mmu_root_page, uint32_t kernel_index) |
Writes the kernel MMU configuration page at index 'kernel_index' in the MMU root page. More... | |
uint32_t | prepareType (int b, uint32_t vaddr) |
Combines a boolean and a virtual address (boolean on the least significant bit) More... | |
vaddr | getVidtVAddr (void) |
vaddr | getNthVAddrFrom (page base, uint32_t size) |
interruptMask | getInterruptMaskFromCtx (contextAddr targetContext) |
bool | noInterruptRequest (interruptMask flagsOnWake) |
bool | firstVAddrGreaterThanSecond (vaddr vaddr1, vaddr vaddr2) |
contextAddr | vaddrToContextAddr (vaddr contextVAddr) |
bool | checkIndexPropertyLTB (userValue userIndex) |
index | userValueToIndex (userValue userIndex) |
void | writeContext (contextAddr ctx, vaddr ctxSaveVAddr, interruptMask flagsOnWake) |
void | loadContext (contextAddr ctx, bool enforce_interrupts) |
Variables | |
uint32_t | current_partition = 0 |
uint32_t | root_partition = 0 |
const uint32_t | nbLevel = 2 |
uint32_t checkRights | ( | uint32_t | read, |
uint32_t | write, | ||
uint32_t | execute | ||
) |
Checks whether we can apply the given rights on the target architecture.
Checks whether the asked rights are applicable to the architecture or not.
read | The read right |
write | The write right |
execute | The execute right |
void disable_paging | ( | ) |
disables paging
void enable_paging | ( | ) |
enables paging
uint32_t getCurPartition | ( | void | ) |
get the current page directory
Interface to get the current Page Directory.
uint32_t getIndexOfAddr | ( | uint32_t | addr, |
uint32_t | index | ||
) |
Gets the index of this address into the given indirection table level.
Get index of indirection level given.
addr | The virtual address |
index | The indirection level address |
interruptMask getInterruptMaskFromCtx | ( | contextAddr | targetContext | ) |
uint32_t getNbIndex | ( | void | ) |
Gets the amount of indirection tables.
Get amount of indirection tables.
uint32_t getRootPartition | ( | void | ) |
get the root partition
Interface to get the current Page Directory.
uint32_t getTableSize | ( | void | ) |
Gets size of indirection table.
Table size.
vaddr getVidtVAddr | ( | void | ) |
void ial_resume_ctx | ( | user_ctx_t * | context | ) |
void loadContext | ( | contextAddr | ctx, |
bool | enforce_interrupts | ||
) |
bool noInterruptRequest | ( | interruptMask | flagsOnWake | ) |
uint32_t prepareType | ( | int | b, |
uint32_t | vaddr | ||
) |
Combines a boolean and a virtual address (boolean on the least significant bit)
b | |
vaddr |
uint32_t readAccessible | ( | uint32_t | table, |
uint32_t | index | ||
) |
Gets the Accessible flag from the given entry.
Reads the accessible flag.
table | The table to read from |
index | The index in the given table |
uint32_t readPDflag | ( | uint32_t | table, |
uint32_t | index | ||
) |
Reads the Page Directory flag into a shadow table.
table | The shadow page's last indirection |
index | The index into the shadow table |
uint32_t readPhysical | ( | uint32_t | table, |
uint32_t | index | ||
) |
TODO.
FETCH address stored in indirection table, physical version.
table | The shadow page's last indirection |
index | The index into the shadow table |
uint32_t readPhysicalNoFlags | ( | uint32_t | table, |
uint32_t | index | ||
) |
Reads the address stored into table table, at index index, using physical addresses. This function masks the least significant bits that are used by the kernel to store various flags (see readVirEntry
and readPhyEntry
in model)
Reads the address stored into table table, at index index, using physical addresses This function masks the least significant bits that are used by the kernel to store various flags (see readVirEntry
and readPhyEntry
in model)
table | The table to read from |
index | The index in the table |
uint32_t readPresent | ( | uint32_t | table, |
uint32_t | index | ||
) |
Gets the Present flag from the given entry.
Reads the present flag.
table | The table to read from |
index | The index in the given table |
uint32_t readTableVirtual | ( | uint32_t | table, |
uint32_t | index | ||
) |
Reads the address stored into table Table, at index index.
FETCH address stored in indirection table.
table | The table to read from |
index | The index in the table |
void updateCurPartition | ( | uint32_t | descriptor | ) |
Set current partition paddr.
partition | Current partition paddr |
void updateRootPartition | ( | uint32_t | partition | ) |
Set root partition paddr.
partition | Root partition paddr |
contextAddr vaddrToContextAddr | ( | vaddr | contextVAddr | ) |
void writeAccessible | ( | uint32_t | pd, |
uint32_t | v, | ||
uint32_t | access | ||
) |
Marks a page as accessible or not.
Writes the accessible flag.
Modify the user bit value.
table | The indirection table |
index | The index into this indirection table |
value | 0 if the page is kernel-only, 1 else (any other value should be forbidden...) |
pd | a page directory |
v | a virtual address |
access | the new value of the user bit |
void writeContext | ( | contextAddr | ctx, |
vaddr | ctxSaveVAddr, | ||
interruptMask | flagsOnWake | ||
) |
void writeKernelPhysicalEntry | ( | uint32_t | child_mmu_root_page, |
uint32_t | kernel_index | ||
) |
Writes the kernel MMU configuration page at index 'kernel_index' in the MMU root page.
This function is the real world version of the model's "mapKernel". We use the same MMU table page for every partition that is configured at boot time for the root partition. When creating a partition, that page is looked up in the MMU configuration pages of the parent partition and written at the same place.
void writePDflag | ( | uint32_t | table, |
uint32_t | index, | ||
uint32_t | value | ||
) |
Writes the Page Directory flag into a shadow table.
Writes the page directory flag contents.
table | The shadow page's last indirection |
index | The index into the shadow table |
value | The vamue of the PD flag |
void writePhysical | ( | uint32_t | table, |
uint32_t | index, | ||
uint32_t | addr | ||
) |
Stores the given address into the given indirection table, at the given index, with physical addresses.
STORE an address in an indirection table, physical version.
table | The table to store into |
index | The index in the table |
addr | The address to store |
void writePhysicalNoFlags | ( | uint32_t | table, |
uint32_t | index, | ||
uint32_t | addr | ||
) |
TODO.
table | The shadow page's last indirection |
index | The index into the shadow table |
addr | The index to write |
uint32_t current_partition = 0 |
const uint32_t nbLevel = 2 |
uint32_t root_partition = 0 |