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

Subversion Repositories c0or1k

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

powered by: WebSVN 2.1.0

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