OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [conts/] [test_suite0/] [src/] [arch/] [arm/] [v7/] [mm.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 drasko
/*
2
 * ARMv7 specific functions
3
 *
4
 * Copyright (C) 2008 - 2010 B Labs Ltd.
5
 */
6
#include <macros.h>
7
#include <l4lib/exregs.h>
8
#include <fault.h>
9
#include INC_SUBARCH(mm.h)
10
#include INC_SUBARCH(exception.h)
11
 
12
/* Get simplified access permissions */
13
int pte_get_access_simple(pte_t pte)
14
{
15
        /* Place AP[2] and AP[1] in [1:0] positions and return */
16
        return (((pte >> PTE_AP2_BIT) & 1) << 1)
17
               | ((pte >> PTE_AP1_BIT) & 1);
18
}
19
 
20
int is_translation_fault(u32 fsr)
21
{
22
        return (fsr & FSR_FS_MASK) == ABORT_TRANSLATION_PAGE;
23
}
24
 
25
unsigned int vm_prot_flags(pte_t pte, u32 fsr)
26
{
27
        unsigned int pte_prot_flags = 0;
28
 
29
        /* Translation fault means no permissions */
30
        if (is_translation_fault(fsr))
31
                return VM_NONE;
32
 
33
        /* Check simplified permission bits */
34
        switch (pte_get_access_simple(pte)) {
35
        case AP_SIMPLE_USER_RW_KERN_RW:
36
                pte_prot_flags |= VM_WRITE;
37
        case AP_SIMPLE_USER_RO_KERN_RO:
38
                pte_prot_flags |= VM_READ;
39
 
40
                /* Also, check exec never bit */
41
                if (!(pte & (1 << PTE_XN_BIT)))
42
                        pte_prot_flags |= VM_EXEC;
43
                break;
44
        case AP_SIMPLE_USER_NONE_KERN_RW:
45
        case AP_SIMPLE_USER_NONE_KERN_RO:
46
        default:
47
                pte_prot_flags = VM_NONE;
48
                break;
49
        }
50
 
51
        return pte_prot_flags;
52
}
53
 
54
void set_generic_fault_params(struct fault_data *fault)
55
{
56
        fault->pte_flags = vm_prot_flags(fault->kdata->pte, fault->kdata->fsr);
57
        fault->reason = 0;
58
 
59
        /*
60
         * Prefetch fault denotes exec fault.
61
         */
62
        if (is_prefetch_abort(fault->kdata->fsr)) {
63
                fault->reason |= VM_EXEC;
64
                fault->address = fault->kdata->faulty_pc;
65
        } else {
66
                fault->address = fault->kdata->far;
67
 
68
                /* Write-not-read bit determines fault */
69
                if (fault->kdata->fsr & (1 << DFSR_WNR_BIT))
70
                        fault->reason |= VM_WRITE;
71
                else
72
                        fault->reason |= VM_READ;
73
        }
74
}
75
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.