= Paged Virtual memory = The [source:soft/giet_vm/giet_common/vmem.c vmem.c] and [source:soft/giet_vm/giet_common/vmem.h vmem.h] files define the data structures and services functions that can be used by both the boot-loader and the kernel to implement the paged virtual memory. [[PageOutline]] The page table initialisation is statically done by the boot-loader. There is one page table for each vspace defined in the mapping. When the architecture is clusterised (X_WIDTH > 1 or Y_WIDTH > 1), for each vspace, there is one page table per cluster. These functions can also be used by the kernel to dynamically map and unmap files to an application MMAP segment. The virtual address format is 32 bits: structured in 3 fields: || 11 || 9 || 12 || || IX1 || IX2 || OFFSET || * The IX1 field is the index in the first level page table * The IX2 field is the index in the second level page table. * The |IX1|IX2| concatenation defines the VPN (Virtual Page Number). Two page sizes are supported: * BPP : Big Physical Page / 2 Mbytes * SPP : Small Physical pages / 4 Kbytes === 1) void '''_v2p_add_pte1'''( unsigned int vspace_id , unsigned int x , unsigned int y , unsigned int vpn , unsigned int flags , unsigned int ppn , unsigned int ident ) === This function registers a new PTE1 entry (BPP) in the page table defined by the argument, and the coordinates. The value is defined by the and arguments. It takes the lock protecting the target page table, and updates only the first level PT1. Exit if page table does not exist, or if the PTE1 already mapped. === 2) void '''_v2p_add_pte2'''( unsigned int vspace_id , unsigned int x , unsigned int y , unsigned int vpn ) === This function registers a new PTE2 entry (SPP) in the page table defined by the argument, and the coordinates. The value is defined by the and arguments. It takes the lock protecting the target page table, and updates both the first level PT1 and the second level PT2. Exit if page table does not exist, or if the PTE1 already mapped, or if not enough PT2s. === 3) void '''_v2p_del_pte1'''( unsigned int vspace_id , unsigned int x , unsigned int y , unsigned int vpn ) === This function invalidates a PTE1 entry (BPP), or a PTN identified by the argument, from the PT1 page table defined by the argument, and the coordinates. Exit if page table does not exist, or if PTE1 unmapped. === 4) void '''_v2p_del_pte2'''( unsigned int vspace_id , unsigned int x , unsigned int y , unsigned int vpn ) === This function invalidates a PTE2 entry (SPP) identified by the , from the PT2 page table defined by the argument, and the coordinates. Exit if page table does not exist, or if PTE2 unmapped. === 5) unsigned long long '''_v2p_translate'''( unsigned int vaddr , unsigned int* flags ) === This function returns the physical address from the virtual address . The MMU is supposed to be activated, and it uses the page table defined by the CP0_PTPR register. It supports both small (4 Kbytes) & big (2 Mbytes) pages. The PTE1 or PTE2 flags are returned in the buffer. Exit if PTE1 or PTE2 unmapped.