= Virtual to Physical Address Translation = 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 functions used by 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, the page table is replicated in each cluster. 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 === 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. * '''vaddr''': virtual address. * '''flags''': page flags are returned in this variable. Exit if PTE1 or PTE2 unmapped. === 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 (BPP)vin the page table defined by the argument, and the coordinates. The value is defined by the and arguments. It updates only the first level PT1. As each vseg is mapped by a different processor, the PT1 entry cannot be concurrently accessed, and we don't need to take any lock. === void '''_v2p_add_pte2'''( unsigned int vspace_id , unsigned int x , unsigned int y , unsigned int vpn ) === === void '''_v2p_del_pte1'''( unsigned int vspace_id , unsigned int x , unsigned int y , unsigned int vpn ) === === void '''_v2p_del_pte2'''( unsigned int vspace_id , unsigned int x , unsigned int y , unsigned int vpn ) ===