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

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [conts/] [posix/] [libposix/] [shm.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 drasko
/*
2
 * This is the glue logic between posix shared memory functions
3
 * and their L4 implementation.
4
 *
5
 * Copyright (C) 2007, 2008 Bahadir Balban
6
 */
7
#include <errno.h>
8
#include <stdio.h>
9
#include <sys/shm.h>
10
#include <sys/types.h>
11
#include <l4lib/ipcdefs.h>
12
#include <l4/macros.h>
13
#include <libposix.h>
14
 
15
int l4_shmget(l4id_t key, int size, int shmflg)
16
{
17
        int err;
18
 
19
        write_mr(L4SYS_ARG0, key);
20
        write_mr(L4SYS_ARG1, size);
21
        write_mr(L4SYS_ARG2, shmflg);
22
 
23
        /* Call pager with shmget() request. Check ipc error. */
24
        if ((err = l4_sendrecv(pagerid, pagerid, L4_IPC_TAG_SHMGET)) < 0) {
25
                print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
26
                return err;
27
        }
28
        /* Check if syscall itself was successful */
29
        if (IS_ERR(err = l4_get_retval())) {
30
                print_err("%s: SHMGET Error: %d.\n", __FUNCTION__, err);
31
                return err;
32
        }
33
 
34
        /* Otherwise err has the positive id number */
35
        return err;
36
}
37
 
38
void *l4_shmat(l4id_t shmid, const void *shmaddr, int shmflg)
39
{
40
        int err;
41
 
42
        write_mr(L4SYS_ARG0, shmid);
43
        write_mr(L4SYS_ARG1, (unsigned long)shmaddr);
44
        write_mr(L4SYS_ARG2, shmflg);
45
 
46
        /* Call pager with shmget() request. Check ipc error. */
47
        if ((err = l4_sendrecv(pagerid, pagerid, L4_IPC_TAG_SHMAT)) < 0) {
48
                print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
49
                return PTR_ERR(err);
50
        }
51
        /* Check if syscall itself was successful */
52
        if (IS_ERR(err = l4_get_retval())) {
53
                print_err("%s: SHMAT Error: %d.\n", __FUNCTION__, err);
54
                return PTR_ERR(err);
55
 
56
        }
57
        /* Obtain shm base. */
58
        return (void *)err;
59
}
60
 
61
int l4_shmdt(const void *shmaddr)
62
{
63
        int err;
64
 
65
        write_mr(L4SYS_ARG0, (unsigned long)shmaddr);
66
 
67
        /* Call pager with shmget() request. Check ipc error. */
68
        if ((err = l4_sendrecv(pagerid, pagerid, L4_IPC_TAG_SHMDT)) < 0) {
69
                print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
70
                return -1;
71
        }
72
        /* Check if syscall itself was successful */
73
        if ((err = l4_get_retval()) < 0) {
74
                print_err("%s: SHMDT Error: %d.\n", __FUNCTION__, err);
75
                return -1;
76
        }
77
        return 0;
78
}
79
 
80
int shmget(key_t key, size_t size, int shmflg)
81
{
82
        int ret = l4_shmget(key, size, shmflg);
83
 
84
        /* If error, return positive error code */
85
        if (ret < 0) {
86
                errno = -ret;
87
                return -1;
88
        }
89
        /* else return value */
90
        return ret;
91
}
92
 
93
void *shmat(int shmid, const void *shmaddr, int shmflg)
94
{
95
        void *ret = l4_shmat(shmid, shmaddr, shmflg);
96
 
97
        /* If error, return positive error code */
98
        if (IS_ERR(ret)) {
99
                errno = -((int)ret);
100
                return PTR_ERR(-1);
101
        }
102
        /* else return value */
103
        return ret;
104
}
105
 
106
int shmdt(const void *shmaddr)
107
{
108
        int ret = l4_shmdt(shmaddr);
109
 
110
        /* If error, return positive error code */
111
        if (ret < 0) {
112
                errno = -ret;
113
                return -1;
114
        }
115
        /* else return value */
116
        return ret;
117
}
118
 

powered by: WebSVN 2.1.0

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