7 * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich.
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.
18 * Initialize mem_serv while spawning it.
20 errval_t initialize_mem_serv(struct spawninfo *si)
24 /* copy supercn to memory server */;
25 struct capref init_supercn_cap = {
27 .slot = ROOTCN_SLOT_SUPERCN0
29 struct capref child_supercn_cap = {
31 .slot = ROOTCN_SLOT_SUPERCN0
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);
38 /* copy supercn to memory server */;
39 init_supercn_cap.slot = ROOTCN_SLOT_SUPERCN1;
40 child_supercn_cap.slot = ROOTCN_SLOT_SUPERCN1;
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);
50 errval_t initialize_monitor(struct spawninfo *si)
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);
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);
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);
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);
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);
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);
115 #endif // __x86_64__ || __i386__
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);
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);
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);
150 #endif // CONFIG_INTERCONNECT_DRIVER_UMP