6aaae1168d568dd2e244e3eaf4e21380af15c257
[barrelfish] / usr / init / spawn.c
1 /**
2  * \file
3  * \brief
4  */
5
6 /*
7  * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 #include "init.h"
16
17 /**
18  * Initialize mem_serv while spawning it.
19  */
20 errval_t initialize_mem_serv(struct spawninfo *si)
21 {
22     errval_t err;
23
24     /* copy supercn to memory server */;
25     struct capref init_supercn_cap = {
26         .cnode = cnode_root,
27         .slot  = ROOTCN_SLOT_SUPERCN0
28     };
29     struct capref child_supercn_cap = {
30         .cnode = si->rootcn,
31         .slot  = ROOTCN_SLOT_SUPERCN0
32     };
33     err = cap_copy(child_supercn_cap, init_supercn_cap);
34     if (err_is_fail(err)) {
35         return err_push(err, INIT_ERR_COPY_SUPERCN_CAP);
36     }
37
38     /* copy supercn to memory server */;
39     init_supercn_cap.slot = ROOTCN_SLOT_SUPERCN1;
40     child_supercn_cap.slot = ROOTCN_SLOT_SUPERCN1;
41
42     err = cap_copy(child_supercn_cap, init_supercn_cap);
43     if (err_is_fail(err)) {
44         return err_push(err, INIT_ERR_COPY_SUPERCN_CAP);
45     }
46
47     return SYS_ERR_OK;
48 }
49
50 errval_t initialize_monitor(struct spawninfo *si)
51 {
52     errval_t err;
53
54     /* Give monitor the kernel capability */
55     struct capref dest, src;
56     dest.cnode = si->taskcn;
57     dest.slot  = TASKCN_SLOT_KERNELCAP;
58     src.cnode = cnode_task;
59     src.slot  = TASKCN_SLOT_KERNELCAP;
60     err = cap_copy(dest, src);
61     if (err_is_fail(err)) {
62         return err_push(err, INIT_ERR_COPY_KERNEL_CAP);
63     }
64
65     /* Give monitor the perfmon capability */
66     dest.cnode = si->taskcn;
67     dest.slot = TASKCN_SLOT_PERF_MON;
68     src.cnode = cnode_task;
69     src.slot = TASKCN_SLOT_PERF_MON;
70     err = cap_copy(dest, src);
71     if (err_is_fail(err)) {
72         return err_push(err, INIT_ERR_COPY_PERF_MON);
73     }
74
75     /* Give monitor modulecn */
76     dest.cnode = si->rootcn;
77     dest.slot  = ROOTCN_SLOT_MODULECN;
78     src.cnode = cnode_root;
79     src.slot  = ROOTCN_SLOT_MODULECN;
80     err = cap_copy(dest, src);
81     if (err_is_fail(err)) {
82         return err_push(err, INIT_ERR_COPY_MODULECN_CAP);
83     }
84
85     /* Give monitor physaddr cn */
86     dest.cnode = si->rootcn;
87     dest.slot  = ROOTCN_SLOT_PACN;
88     src.cnode = cnode_root;
89     src.slot  = ROOTCN_SLOT_PACN;
90     err = cap_copy(dest, src);
91     if (err_is_fail(err)) {
92         return err_push(err, INIT_ERR_COPY_PACN_CAP);
93     }
94
95 #if __x86_64__ || __i386__ || __k1om__
96     /* Give monitor IRQ */
97     dest.cnode = si->taskcn;
98     dest.slot  = TASKCN_SLOT_IRQ;
99     src.cnode = cnode_task;
100     src.slot  = TASKCN_SLOT_IRQ;
101     err = cap_copy(dest, src);
102     if (err_is_fail(err)) {
103         return err_push(err, INIT_ERR_COPY_IRQ_CAP);
104     }
105
106     /* Give monitor IO */
107     dest.cnode = si->taskcn;
108     dest.slot  = TASKCN_SLOT_IO;
109     src.cnode = cnode_task;
110     src.slot  = TASKCN_SLOT_IO;
111     err = cap_copy(dest, src);
112     if (err_is_fail(err)) {
113         return err_push(err, INIT_ERR_COPY_IO_CAP);
114     }
115 #endif // __x86_64__ || __i386__
116
117 #if __arm__
118     /* Give monitor IO */
119        dest.cnode = si->taskcn;
120        dest.slot  = TASKCN_SLOT_IO;
121        src.cnode = cnode_task;
122        src.slot  = TASKCN_SLOT_IO;
123        err = cap_copy(dest, src);
124        if (err_is_fail(err)) {
125            return err_push(err, INIT_ERR_COPY_IO_CAP);
126        }
127        /* Give monitor IRQ */
128            dest.cnode = si->taskcn;
129            dest.slot  = TASKCN_SLOT_IRQ;
130            src.cnode = cnode_task;
131            src.slot  = TASKCN_SLOT_IRQ;
132            err = cap_copy(dest, src);
133            if (err_is_fail(err)) {
134                return err_push(err, INIT_ERR_COPY_IRQ_CAP);
135            }
136 #endif
137
138 #ifdef CONFIG_INTERCONNECT_DRIVER_UMP
139 #if 0   // XXX: Disabled until SCC has a decent memory allocator
140     /* Give monitor the foreign frame capability */
141     dest.cnode = si->taskcn;
142     dest.slot  = TASKCN_SLOT_MON_URPC;
143     src.cnode = cnode_task;
144     src.slot  = TASKCN_SLOT_MON_URPC;
145     err = cap_copy(dest, src);
146     if (err_is_fail(err)) {
147         return err_push(err, INIT_ERR_COPY_UMP_CAP);
148     }
149 #endif
150 #endif // CONFIG_INTERCONNECT_DRIVER_UMP
151
152     return SYS_ERR_OK;
153 }