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

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [conts/] [libl4/] [src/] [lib/] [cap/] [cap.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 drasko
/*
2
 * Capability-related userspace helpers
3
 *
4
 * Copyright (C) 2009 B Labs Ltd.
5
 */
6
#include <l4lib/macros.h>
7
#include L4LIB_INC_ARCH(syscalls.h)
8
#include <l4lib/lib/cap.h>
9
#include <stdio.h>
10
 
11
/* A static limit to total capabilities held by the library */
12
#define CAPS_TOTAL                      64
13
 
14
static struct capability cap_array[CAPS_TOTAL];
15
 
16
static int total_caps = 0;
17
 
18
struct capability *cap_get_by_type(unsigned int cap_type)
19
{
20
        for (int i = 0; i < total_caps; i++)
21
                if (cap_type(&cap_array[i]) == cap_type)
22
                        return &cap_array[i];
23
        return 0;
24
}
25
 
26
struct capability *cap_get_physmem(unsigned int cap_type)
27
{
28
        for (int i = 0; i < total_caps; i++)
29
                if ((cap_type(&cap_array[i]) == CAP_TYPE_MAP_PHYSMEM) &&
30
                    !cap_is_devmem(&cap_array[i])) {
31
                        return &cap_array[i];
32
                }
33
        return 0;
34
}
35
 
36
/*
37
 * Read all capabilities
38
 */
39
int caps_read_all(void)
40
{
41
        int err;
42
 
43
        /* Read number of capabilities */
44
        if ((err = l4_capability_control(CAP_CONTROL_NCAPS,
45
                                         0, &total_caps)) < 0) {
46
                printf("l4_capability_control() reading # of"
47
                       " capabilities failed.\n Could not "
48
                       "complete CAP_CONTROL_NCAPS request.\n");
49
                return err;
50
        }
51
 
52
        if (total_caps > CAPS_TOTAL) {
53
                printf("FATAL: More capabilities defined for the "
54
                       "container than the libl4 static limit. libl4 "
55
                       "limit=%d, actual = %d\n", CAPS_TOTAL, total_caps);
56
                BUG();
57
        }
58
 
59
        /* Read all capabilities */
60
        if ((err = l4_capability_control(CAP_CONTROL_READ,
61
                                         0, cap_array)) < 0) {
62
                printf("l4_capability resource_control() reading of "
63
                       "capabilities failed.\n Could not "
64
                       "complete CAP_CONTROL_READ request.\n");
65
                return err;
66
        }
67
        //cap_array_print(ncaps, caparray);
68
 
69
        return 0;
70
}
71
 
72
void __l4_capability_init(void)
73
{
74
        caps_read_all();
75
}
76
 
77
void cap_dev_print(struct capability *cap)
78
{
79
        switch (cap_devtype(cap)) {
80
        case CAP_DEVTYPE_UART:
81
                printf("Device type:\t\t\t%s%d\n", "UART", cap_devnum(cap));
82
                break;
83
        case CAP_DEVTYPE_TIMER:
84
                printf("Device type:\t\t\t%s%d\n", "Timer", cap_devnum(cap));
85
                break;
86
        default:
87
                return;
88
        }
89
        printf("Device Irq:\t\t%d\n", cap->irq);
90
}
91
 
92
void cap_print(struct capability *cap)
93
{
94
        printf("Capability id:\t\t\t%d\n", cap->capid);
95
        printf("Capability resource id:\t\t%d\n", cap->resid);
96
        printf("Capability owner id:\t\t%d\n",cap->owner);
97
 
98
        switch (cap_type(cap)) {
99
        case CAP_TYPE_TCTRL:
100
                printf("Capability type:\t\t%s\n", "Thread Control");
101
                break;
102
        case CAP_TYPE_EXREGS:
103
                printf("Capability type:\t\t%s\n", "Exchange Registers");
104
                break;
105
        case CAP_TYPE_MAP_PHYSMEM:
106
                if (!cap_is_devmem(cap)) {
107
                        printf("Capability type:\t\t%s\n", "Map/Physmem");
108
                } else {
109
                        printf("Capability type:\t\t%s\n", "Map/Physmem/Device");
110
                        cap_dev_print(cap);
111
                }
112
                break;
113
        case CAP_TYPE_MAP_VIRTMEM:
114
                printf("Capability type:\t\t%s\n", "Map/Virtmem");
115
                break;
116
        case CAP_TYPE_IPC:
117
                printf("Capability type:\t\t%s\n", "Ipc");
118
                break;
119
        case CAP_TYPE_UMUTEX:
120
                printf("Capability type:\t\t%s\n", "Mutex");
121
                break;
122
        case CAP_TYPE_IRQCTRL:
123
                printf("Capability type:\t\t%s\n", "IRQ Control");
124
                break;
125
        case CAP_TYPE_QUANTITY:
126
                printf("Capability type:\t\t%s\n", "Quantitative");
127
                break;
128
        default:
129
                printf("Capability type:\t\t%s\n", "Unknown");
130
                break;
131
        }
132
 
133
        switch (cap_rtype(cap)) {
134
        case CAP_RTYPE_THREAD:
135
                printf("Capability resource type:\t%s\n", "Thread");
136
                break;
137
        case CAP_RTYPE_SPACE:
138
                printf("Capability resource type:\t%s\n", "Space");
139
                break;
140
        case CAP_RTYPE_CONTAINER:
141
                printf("Capability resource type:\t%s\n", "Container");
142
                break;
143
        case CAP_RTYPE_THREADPOOL:
144
                printf("Capability resource type:\t%s\n", "Thread Pool");
145
                break;
146
        case CAP_RTYPE_SPACEPOOL:
147
                printf("Capability resource type:\t%s\n", "Space Pool");
148
                break;
149
        case CAP_RTYPE_MUTEXPOOL:
150
                printf("Capability resource type:\t%s\n", "Mutex Pool");
151
                break;
152
        case CAP_RTYPE_MAPPOOL:
153
                printf("Capability resource type:\t%s\n", "Map Pool (PMDS)");
154
                break;
155
        case CAP_RTYPE_CPUPOOL:
156
                printf("Capability resource type:\t%s\n", "Cpu Pool");
157
                break;
158
        case CAP_RTYPE_CAPPOOL:
159
                printf("Capability resource type:\t%s\n", "Capability Pool");
160
                break;
161
        default:
162
                printf("Capability resource type:\t%s\n", "Unknown");
163
                break;
164
        }
165
        printf("\n");
166
}
167
 
168
void cap_array_print(int total_caps, struct capability *caparray)
169
{
170
        printf("Capabilities\n"
171
                "~~~~~~~~~~~~\n");
172
 
173
        for (int i = 0; i < total_caps; i++)
174
                cap_print(&caparray[i]);
175
 
176
        printf("\n");
177
}
178
 
179
 

powered by: WebSVN 2.1.0

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