Pip
Architecture-dependent parts of Pip: MAL, IAL and boot
Macros | Functions | Variables
mal.h File Reference

Memory Abstraction Layer common interface. More...

#include <stdint.h>
#include "maldefines.h"

Go to the source code of this file.

Macros

#define nbPage   maxPages
 

Functions

void enable_paging ()
 enables paging More...
 
void disable_paging ()
 disables paging More...
 
uint32_t getCurPartition (void)
 Interface to get the current Page Directory. More...
 
void updateCurPartition (uint32_t descriptor)
 Set current partition paddr. More...
 
uint32_t getRootPartition (void)
 Interface to get the current Page Directory. More...
 
void updateRootPartition (uint32_t descriptor)
 Set root partition paddr. More...
 
uint32_t getNbIndex ()
 Get amount of indirection tables. More...
 
uint32_t getIndexOfAddr (uint32_t addr, uint32_t index)
 Get index of indirection level given. More...
 
uint32_t getOffsetOfAddr (uint32_t addr)
 Get offset from address. More...
 
uint32_t readTableVirtual (uint32_t table, uint32_t index)
 FETCH address stored in indirection table. More...
 
uint32_t readTableVirtualNoFlags (uint32_t table, uint32_t index)
 FETCH address stored in indirection table. More...
 
uint32_t readArray (uint32_t table, uint32_t index)
 Read an array's contents. More...
 
void writeTableVirtual (uint32_t table, uint32_t index, uint32_t addr)
 STORE an address in an indirection table. More...
 
void writeTableVirtualNoFlags (uint32_t table, uint32_t index, uint32_t addr)
 STORE an address in an indirection table. More...
 
uint32_t readPresent (uint32_t table, uint32_t index)
 Reads the present flag. More...
 
void writePresent (uint32_t table, uint32_t index, uint32_t value)
 Writes the present flag. More...
 
uint32_t readAccessible (uint32_t table, uint32_t index)
 Reads the accessible flag. More...
 
void writeAccessible (uint32_t table, uint32_t index, uint32_t value)
 Writes the accessible flag. More...
 
uint32_t readPhysical (uint32_t table, uint32_t index)
 FETCH address stored in indirection table, physical version. 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...
 
void writePhysical (uint32_t table, uint32_t index, uint32_t addr)
 STORE an address in an indirection table, physical version. More...
 
void writePhysicalNoFlags (uint32_t table, uint32_t index, uint32_t addr)
 TODO. More...
 
uint32_t readIndex (uint32_t table, uint32_t index)
 FETCH index stored in indirection table, physical version. More...
 
void writeIndex (uint32_t table, uint32_t index, uint32_t idx)
 STORE an index in an indirection table, physical version. More...
 
uint32_t dereferenceVirtual (uint32_t addr)
 
uint32_t derivated (uint32_t table, uint32_t index)
 Returns 1 if the page is derivated, 0 else. More...
 
uint32_t readPDflag (uint32_t table, uint32_t index)
 Reads the Page Directory flag into a shadow table. More...
 
void writePDflag (uint32_t table, uint32_t index, uint32_t value)
 Writes the page directory flag contents. More...
 
uint32_t get_pd ()
 Returns the VIRTUAL ADDRESS of the current Page Directory. More...
 
void cleanPageEntry (uint32_t table, uint32_t index)
 Cleans a page entry, setting its contents to 0x00000000. More...
 
uint32_t defaultAddr (void)
 Default address, should be 0x00000000. More...
 
uint32_t getTableSize (void)
 Table size. More...
 
uint32_t getMaxIndex (void)
 Table size. More...
 
uint32_t addressEquals (uint32_t addr, uint32_t addr2)
 Checks whether an address is equal to another. More...
 
void cleanPage (uint32_t paddr)
 Cleans a given page, filling it with zero. More...
 
uint32_t checkRights (uint32_t read, uint32_t write, uint32_t execute)
 Checks whether the asked rights are applicable to the architecture or not. More...
 
uint32_t applyRights (uint32_t table, uint32_t index, uint32_t read, uint32_t write, uint32_t execute)
 Apply the asked rights to the given entry. More...
 
uint32_t toAddr (uint32_t input)
 Converts a given uint32_t to an address (only for Haskell FFI purposes) More...
 
int geb (const uint32_t a, const uint32_t b)
 Greater or equal. More...
 
int gtb (const uint32_t a, const uint32_t b)
 Greater than. More...
 
int leb (const uint32_t a, const uint32_t b)
 Lower or equal. More...
 
int ltb (const uint32_t a, const uint32_t b)
 Lower than. More...
 
int eqb (const uint32_t a, const uint32_t b)
 Equals. More...
 
uint32_t mul3 (uint32_t v)
 Multiply an integer with 3. More...
 
uint32_t inc (uint32_t val)
 Increment an integer. More...
 
uint32_t sub (uint32_t val)
 Decrement an integer. More...
 
uint32_t zero ()
 Zero. That's it. More...
 
uint32_t indexPR (void)
 Partiton descriptor index into itself. More...
 
uint32_t indexPD (void)
 Page directory index within partition descriptor. More...
 
uint32_t indexSh1 (void)
 Shadow 1 index within partition descriptor. More...
 
uint32_t indexSh2 (void)
 Shadow 2 index within partition descriptor. More...
 
uint32_t indexSh3 (void)
 Configuration tables linked list index within partition descriptor. More...
 
uint32_t PPRidx (void)
 Parent partition index within partition descriptor. More...
 
uint32_t kernelIndex (void)
 Index of kernel's page directory entry. More...
 
void writePhysicalWithLotsOfFlags (uint32_t table, uint32_t index, uint32_t addr, uint32_t present, uint32_t user, uint32_t read, uint32_t write, uint32_t execute)
 Write a physical entry with all the possible flags we might need. More...
 
void writeKernelPhysicalEntry (uint32_t 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 extractPreIndex (uint32_t vaddr, uint32_t index)
 
uint32_t prepareType (int b, uint32_t vaddr)
 Combines a boolean and a virtual address (boolean on the least significant bit) More...
 
void updateMMURoot (page MMURoot)
 updates the virtual address space root page More...
 
interruptMask getInterruptMaskFromCtx (contextAddr context)
 
bool noInterruptRequest (interruptMask flagsOnWake)
 
bool firstVAddrGreaterThanSecond (vaddr vaddr1, vaddr vaddr2)
 
contextAddr vaddrToContextAddr (vaddr contextVAddr)
 
bool checkIndexPropertyLTB (userValue userIndex)
 
index userValueToIndex (userValue userIndex)
 
vaddr getVidtVAddr ()
 
vaddr getNthVAddrFrom (page base, uint32_t size)
 
void writeContext (contextAddr ctx, vaddr ctxSaveVAddr, interruptMask flagsOnWake)
 
void loadContext (contextAddr ctx, bool enforce_interrupts)
 

Variables

const uint32_t defaultVAddr
 Default address, should be 0x00000000. More...
 
const uint32_t nbLevel
 
uint32_t maxPages
 The maximal amount of pages available. More...
 

Detailed Description

Memory Abstraction Layer common interface.

Macro Definition Documentation

◆ nbPage

#define nbPage   maxPages

Function Documentation

◆ addressEquals()

uint32_t addressEquals ( uint32_t  addr,
uint32_t  addr2 
)

Checks whether an address is equal to another.

Checks whether an address is equal to another.

Parameters
addrAddress to check
addr2Address to compare to
Returns
0 is not equal, 1 otherwise.

◆ applyRights()

uint32_t applyRights ( uint32_t  table,
uint32_t  index,
uint32_t  read,
uint32_t  write,
uint32_t  execute 
)

Apply the asked rights to the given entry.

◆ checkIndexPropertyLTB()

bool checkIndexPropertyLTB ( userValue  userIndex)

◆ checkRights()

uint32_t checkRights ( uint32_t  read,
uint32_t  write,
uint32_t  execute 
)

Checks whether the asked rights are applicable to the architecture or not.

Checks whether the asked rights are applicable to the architecture or not.

Parameters
readThe read right
writeThe write right
executeThe execute right
Returns
1 if we can, 0 if we can't

◆ cleanPage()

void cleanPage ( uint32_t  paddr)

Cleans a given page, filling it with zero.

Cleans a given page, filling it with zero.

Parameters
paddrThe page's physical address

◆ cleanPageEntry()

void cleanPageEntry ( uint32_t  table,
uint32_t  index 
)

Cleans a page entry, setting its contents to 0x00000000.

◆ defaultAddr()

uint32_t defaultAddr ( void  )

Default address, should be 0x00000000.

Default address, should be 0x00000000.

Returns
The null address.

◆ dereferenceVirtual()

uint32_t dereferenceVirtual ( uint32_t  addr)
Parameters
addrThe virtual address to dereference
Returns
The contents of the pointer
Warning
I don't think this is still used. Anyway, it should never be. Never. Removing this soon.

◆ derivated()

uint32_t derivated ( uint32_t  table,
uint32_t  index 
)

Returns 1 if the page is derivated, 0 else.

◆ disable_paging()

void disable_paging ( )

disables paging

Postcondition
paging mechanism is disabled

◆ enable_paging()

void enable_paging ( )

enables paging

Postcondition
paging mechanism is enabled

◆ eqb()

int eqb ( const uint32_t  a,
const uint32_t  b 
)

Equals.

Equals.

Returns
the comparison.

◆ extractPreIndex()

uint32_t extractPreIndex ( uint32_t  vaddr,
uint32_t  index 
)

◆ firstVAddrGreaterThanSecond()

bool firstVAddrGreaterThanSecond ( vaddr  vaddr1,
vaddr  vaddr2 
)

◆ geb()

int geb ( const uint32_t  a,
const uint32_t  b 
)

Greater or equal.

Greater or equal.

Returns
the comparison.

◆ get_pd()

uint32_t get_pd ( )

Returns the VIRTUAL ADDRESS of the current Page Directory.

◆ getCurPartition()

uint32_t getCurPartition ( void  )

Interface to get the current Page Directory.

Interface to get the current Page Directory.

Returns
the current page directory

◆ getIndexOfAddr()

uint32_t getIndexOfAddr ( uint32_t  addr,
uint32_t  index 
)

Get index of indirection level given.

Get index of indirection level given.

Parameters
addrThe virtual address
indexThe indirection level address
Returns
The desired index

◆ getInterruptMaskFromCtx()

interruptMask getInterruptMaskFromCtx ( contextAddr  context)

◆ getMaxIndex()

uint32_t getMaxIndex ( void  )

Table size.

Table size.

Returns
the maximum index.

◆ getNbIndex()

uint32_t getNbIndex ( void  )

Get amount of indirection tables.

Get amount of indirection tables.

Returns
Amount of maximal indirection tables

◆ getNthVAddrFrom()

vaddr getNthVAddrFrom ( page  base,
uint32_t  size 
)

◆ getOffsetOfAddr()

uint32_t getOffsetOfAddr ( uint32_t  addr)

Get offset from address.

◆ getRootPartition()

uint32_t getRootPartition ( void  )

Interface to get the current Page Directory.

Interface to get the current Page Directory.

Returns
the root partition

◆ getTableSize()

uint32_t getTableSize ( void  )

Table size.

Table size.

Returns
The amount of entries in a page table

◆ getVidtVAddr()

vaddr getVidtVAddr ( )

◆ gtb()

int gtb ( const uint32_t  a,
const uint32_t  b 
)

Greater than.

Greater than.

Returns
the comparison.

◆ inc()

uint32_t inc ( uint32_t  val)

Increment an integer.

Increment an integer.

Returns
the incremented value.

◆ indexPD()

uint32_t indexPD ( void  )

Page directory index within partition descriptor.

Page directory index within partition descriptor.

Returns
The page directory index.

◆ indexPR()

uint32_t indexPR ( void  )

Partiton descriptor index into itself.

Partiton descriptor index into itself.

Returns
The partition root.

◆ indexSh1()

uint32_t indexSh1 ( void  )

Shadow 1 index within partition descriptor.

Shadow 1 index within partition descriptor.

Returns
The shadow 1 index.

◆ indexSh2()

uint32_t indexSh2 ( void  )

Shadow 2 index within partition descriptor.

Shadow 2 index within partition descriptor.

Returns
The shadow 2 index.

◆ indexSh3()

uint32_t indexSh3 ( void  )

Configuration tables linked list index within partition descriptor.

Configuration tables linked list index within partition descriptor.

Returns
The shadow 3 index.

◆ kernelIndex()

uint32_t kernelIndex ( void  )

Index of kernel's page directory entry.

Index of kernel's page directory entry.

Returns
The kernel address.

◆ leb()

int leb ( const uint32_t  a,
const uint32_t  b 
)

Lower or equal.

Lower or equal.

Returns
the comparison.

◆ loadContext()

void loadContext ( contextAddr  ctx,
bool  enforce_interrupts 
)

◆ ltb()

int ltb ( const uint32_t  a,
const uint32_t  b 
)

Lower than.

Lower than.

Returns
the comparison.

◆ mul3()

uint32_t mul3 ( uint32_t  v)

Multiply an integer with 3.

Multiply an integer with 3.

Returns
the result of the multiplication by 3.

◆ noInterruptRequest()

bool noInterruptRequest ( interruptMask  flagsOnWake)

◆ PPRidx()

uint32_t PPRidx ( void  )

Parent partition index within partition descriptor.

Parent partition index within partition descriptor.

Returns
The parent partition root.

◆ prepareType()

uint32_t prepareType ( int  b,
uint32_t  vaddr 
)

Combines a boolean and a virtual address (boolean on the least significant bit)

Parameters
b
vaddr

◆ readAccessible()

uint32_t readAccessible ( uint32_t  table,
uint32_t  index 
)

Reads the accessible flag.

Reads the accessible flag.

Parameters
tableThe table to read from
indexThe index in the given table
Returns
1 if the page is user-mode accessible, 0 else

◆ readArray()

uint32_t readArray ( uint32_t  table,
uint32_t  index 
)

Read an array's contents.

◆ readIndex()

uint32_t readIndex ( uint32_t  table,
uint32_t  index 
)

FETCH index stored in indirection table, physical version.

FETCH index stored in indirection table, physical version.

Parameters
tableThe table to read from
indexThe index in the table
Returns
The index stored in the given slot

◆ readPDflag()

uint32_t readPDflag ( uint32_t  table,
uint32_t  index 
)

Reads the Page Directory flag into a shadow table.

Parameters
tableThe shadow page's last indirection
indexThe index into the shadow table
Returns
The value of the PD flag

◆ readPhysical()

uint32_t readPhysical ( uint32_t  table,
uint32_t  index 
)

FETCH address stored in indirection table, physical version.

FETCH address stored in indirection table, physical version.

Parameters
tableThe shadow page's last indirection
indexThe index into the shadow table
Returns
The value of the PD flag

◆ readPhysicalNoFlags()

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)

Parameters
tableThe table to read from
indexThe index in the table
Returns
The address stored in the given slot, with its least significant bits cleared

◆ readPresent()

uint32_t readPresent ( uint32_t  table,
uint32_t  index 
)

Reads the present flag.

Reads the present flag.

Parameters
tableThe table to read from
indexThe index in the given table
Returns
1 if the page is present, 0 else

◆ readTableVirtual()

uint32_t readTableVirtual ( uint32_t  table,
uint32_t  index 
)

FETCH address stored in indirection table.

FETCH address stored in indirection table.

Parameters
tableThe table to read from
indexThe index in the table
Returns
The address stored in the given slot

◆ readTableVirtualNoFlags()

uint32_t readTableVirtualNoFlags ( uint32_t  table,
uint32_t  index 
)

FETCH address stored in indirection table.

◆ sub()

uint32_t sub ( uint32_t  val)

Decrement an integer.

Decrement an integer.

Returns
the decremented value.

◆ toAddr()

uint32_t toAddr ( uint32_t  input)

Converts a given uint32_t to an address (only for Haskell FFI purposes)

Converts a given uint32_t to an address (only for Haskell FFI purposes)

Parameters
inputThe given integer
Returns
The same integer as an address
Note
This is only for Haskell. C doesn't need this!

◆ updateCurPartition()

void updateCurPartition ( uint32_t  descriptor)

Set current partition paddr.

Parameters
partitionCurrent partition paddr

◆ updateMMURoot()

void updateMMURoot ( page  MMURoot)

updates the virtual address space root page

Parameters
dira page directory
Postcondition
dir is the current virtual space

◆ updateRootPartition()

void updateRootPartition ( uint32_t  partition)

Set root partition paddr.

Parameters
partitionRoot partition paddr

◆ userValueToIndex()

index userValueToIndex ( userValue  userIndex)

◆ vaddrToContextAddr()

contextAddr vaddrToContextAddr ( vaddr  contextVAddr)

◆ writeAccessible()

void writeAccessible ( uint32_t  table,
uint32_t  index,
uint32_t  value 
)

Writes the accessible flag.

Writes the accessible flag.

Modify the user bit value.

Parameters
tableThe indirection table
indexThe index into this indirection table
value0 if the page is kernel-only, 1 else (any other value should be forbidden...)
pda page directory
va virtual address
accessthe new value of the user bit
Postcondition
The accessible bit of the virtual address is equal to access

◆ writeContext()

void writeContext ( contextAddr  ctx,
vaddr  ctxSaveVAddr,
interruptMask  flagsOnWake 
)

◆ writeIndex()

void writeIndex ( uint32_t  table,
uint32_t  index,
uint32_t  idx 
)

STORE an index in an indirection table, physical version.

STORE an index in an indirection table, physical version.

Parameters
tableThe table to store into
indexThe index in the table
addrThe index to store

◆ writeKernelPhysicalEntry()

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.

◆ writePDflag()

void writePDflag ( uint32_t  table,
uint32_t  index,
uint32_t  value 
)

Writes the page directory flag contents.

Writes the page directory flag contents.

Parameters
tableThe shadow page's last indirection
indexThe index into the shadow table
valueThe vamue of the PD flag

◆ writePhysical()

void writePhysical ( uint32_t  table,
uint32_t  index,
uint32_t  val 
)

STORE an address in an indirection table, physical version.

STORE an address in an indirection table, physical version.

Parameters
tableThe table to store into
indexThe index in the table
addrThe address to store

◆ writePhysicalNoFlags()

void writePhysicalNoFlags ( uint32_t  table,
uint32_t  index,
uint32_t  addr 
)

TODO.

Parameters
tableThe shadow page's last indirection
indexThe index into the shadow table
addrThe index to write
Returns
The value of the PD flag

◆ writePhysicalWithLotsOfFlags()

void writePhysicalWithLotsOfFlags ( uint32_t  table,
uint32_t  index,
uint32_t  addr,
uint32_t  present,
uint32_t  user,
uint32_t  read,
uint32_t  write,
uint32_t  execute 
)

Write a physical entry with all the possible flags we might need.

Write a physical entry with all the possible flags we might need.

Parameters
tableThe indirection table in which we find the entry
indexThe index in this table, targeting the specified entry
addrThe target address
present1 if the page is mapped, 0 else
user1 if the page is accessible in userland, 0 else
readThe read right
writeThe write right
executeThe execute right

◆ writePresent()

void writePresent ( uint32_t  table,
uint32_t  index,
uint32_t  value 
)

Writes the present flag.

Writes the present flag.

Parameters
tableThe indirection table
indexThe index into this indirection table
value0 if the page is not present, 1 else (any other value should be forbidden...)

◆ writeTableVirtual()

void writeTableVirtual ( uint32_t  table,
uint32_t  index,
uint32_t  addr 
)

STORE an address in an indirection table.

◆ writeTableVirtualNoFlags()

void writeTableVirtualNoFlags ( uint32_t  table,
uint32_t  index,
uint32_t  addr 
)

STORE an address in an indirection table.

◆ zero()

uint32_t zero ( void  )

Zero. That's it.

Zero. That's it.

Returns
zero.

Variable Documentation

◆ defaultVAddr

const uint32_t defaultVAddr

Default address, should be 0x00000000.

◆ maxPages

uint32_t maxPages

The maximal amount of pages available.

◆ nbLevel

const uint32_t nbLevel