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

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [src/] [api/] [map.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 drasko
/*
2
 * Space-related system calls.
3
 *
4
 * Copyright (C) 2007 Bahadir Balban
5
 */
6
#include <l4/generic/tcb.h>
7
#include INC_API(syscall.h)
8
#include INC_SUBARCH(mm.h)
9
#include <l4/api/errno.h>
10
#include <l4/api/space.h>
11
#include INC_GLUE(mapping.h)
12
 
13
/*
14
 * Userspace syscall requests can only map
15
 * using read/write/exec userspace flags.
16
 */
17
int user_map_flags_validate(unsigned int flags)
18
{
19
        switch (flags) {
20
        case MAP_USR_RO:
21
        case MAP_USR_RW:
22
        case MAP_USR_RWX:
23
        case MAP_USR_RX:
24
        case MAP_USR_IO:
25
                return 1;
26
        default:
27
                return 0;
28
        }
29
        return 0;
30
}
31
 
32
int sys_map(unsigned long phys, unsigned long virt,
33
            unsigned long npages, unsigned int flags, l4id_t tid)
34
{
35
        struct ktcb *target;
36
        int err;
37
 
38
        if (!(target = tcb_find(tid)))
39
                return -ESRCH;
40
 
41
        /* Check flags validity */
42
        if (!user_map_flags_validate(flags))
43
                return -EINVAL;
44
 
45
        if (!npages || !phys || !virt)
46
                return -EINVAL;
47
 
48
        if ((err = cap_map_check(target, phys, virt, npages, flags)) < 0)
49
                return err;
50
 
51
        add_mapping_pgd(phys, virt, npages << PAGE_BITS,
52
                        flags, TASK_PGD(target));
53
 
54
        return 0;
55
}
56
 
57
/*
58
 * Unmaps given range from given task. If the complete range is unmapped
59
 * sucessfully, returns 0. If part of the range was found to be already
60
 * unmapped, returns -1. This is may or may not be an error.
61
 */
62
int sys_unmap(unsigned long virtual, unsigned long npages, unsigned int tid)
63
{
64
        struct ktcb *target;
65
        int ret = 0, retval = 0;
66
 
67
        if (!(target = tcb_find(tid)))
68
                return -ESRCH;
69
 
70
        if (!npages || !virtual)
71
                return -EINVAL;
72
 
73
        if ((ret = cap_unmap_check(target, virtual, npages)) < 0)
74
                return ret;
75
 
76
        for (int i = 0; i < npages; i++) {
77
                ret = remove_mapping_pgd(TASK_PGD(target),
78
                                         virtual + i * PAGE_SIZE);
79
                if (ret)
80
                        retval = ret;
81
        }
82
 
83
        return ret;
84
}
85
 

powered by: WebSVN 2.1.0

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