source: soft/giet_vm/giet_common/vmem.c @ 422

Last change on this file since 422 was 408, checked in by alain, 10 years ago

Introducing a physical memory allocator (pmem.c & pmem.h files).

  • Property svn:executable set to *
File size: 3.2 KB
Line 
1///////////////////////////////////////////////////////////////////////////////////
2// File     : vmem.c
3// Date     : 01/07/2012
4// Author   : alain greiner
5// Copyright (c) UPMC-LIP6
6///////////////////////////////////////////////////////////////////////////////////
7
8#include <utils.h>
9#include <vmem.h>
10#include <giet_config.h>
11
12//////////////////////////////////////////////////
13unsigned int _v2p_translate( page_table_t*  ptab,
14                             unsigned int   vpn,
15                             unsigned int*  ppn,
16                             unsigned int*  flags ) 
17{
18    unsigned long long ptba;
19    unsigned long long pte2_paddr;
20
21    unsigned int pte2_msb;
22    unsigned int pte2_lsb;
23    unsigned int flags_value;
24    unsigned int ppn_value;
25
26    unsigned int ix1 = vpn >> 9;
27    unsigned int ix2 = vpn & 0x1FF;
28
29    unsigned int save_sr;
30
31    // get PTE1
32    unsigned int pte1 = ptab->pt1[ix1];
33
34    // check PTE1 mapping
35    if ( (pte1 & PTE_V) == 0 )
36    {
37        _printf("\n[VMEM ERROR] _v2p_translate() : pte1 unmapped\n");
38        _exit();
39    }
40
41    // test big/small page
42    if ( (pte1 & PTE_T) == 0 )  // big page
43    {
44        // set return values
45        *ppn   = ((pte1 << 9) & 0x0FFFFE00) | (vpn & 0X000001FF);
46        *flags = pte1 & 0xFFC00000;
47    }
48    else                        // small page
49    {
50
51        // get physical addresses of pte2 (two 32 bits words)
52        ptba       = (unsigned long long) (pte1 & 0x0FFFFFFF) << 12;
53        pte2_paddr = ptba + 8*ix2;
54        pte2_lsb   = (unsigned int) pte2_paddr;
55        pte2_msb   = (unsigned int) (pte2_paddr >> 32);
56
57        // disable interrupts and save status register
58        _it_disable( &save_sr );
59
60        // get ppn_value and flags_value, using a physical read
61        // after temporary DTLB desactivation
62        asm volatile (
63                "mfc2    $2,     $1          \n"     /* $2 <= MMU_MODE       */
64                "andi    $3,     $2,    0xb  \n"
65                "mtc2    $3,     $1          \n"     /* DTLB off             */
66
67                "move    $4,     %3          \n"     /* $4 <= pte_lsb        */
68                "mtc2    %2,     $24         \n"     /* PADDR_EXT <= pte_msb */
69                "lw      %0,     0($4)       \n"     /* read flags           */ 
70                "lw      %1,     4($4)       \n"     /* read ppn             */
71                "mtc2    $0,     $24         \n"     /* PADDR_EXT <= 0       */
72
73                "mtc2    $2,     $1          \n"     /* restore MMU_MODE     */
74                : "=r" (flags_value), "=r" (ppn_value)
75                : "r"  (pte2_msb)   , "r"  (pte2_lsb)
76                : "$2", "$3", "$4" );
77
78        // restore saved status register
79        _it_restore( &save_sr );
80
81        // set return values
82        *ppn   = ppn_value   & 0x0FFFFFFF;
83        *flags = flags_value & 0xFFC00000;
84
85        // check PTE2 mapping
86        if ( (flags_value & PTE_V) == 0 )
87        {
88            _printf("\n[VMEM ERROR] _v2p_translate() : pte2 unmapped\n");
89            _exit();
90        }
91    }
92    return 0;
93} // end _v2p_translate()
94
95
96
97// Local Variables:
98// tab-width: 4
99// c-basic-offset: 4
100// c-file-offsets:((innamespace . 0)(inline-open . 0))
101// indent-tabs-mode: nil
102// End:
103// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
104
105
Note: See TracBrowser for help on using the repository browser.