added entries to gitignore
[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_SUPERCN
28     };
29     struct capref child_supercn_cap = {
30         .cnode = si->rootcn,
31         .slot  = ROOTCN_SLOT_SUPERCN
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     return SYS_ERR_OK;
39 }
40
41 errval_t initialize_monitor(struct spawninfo *si)
42 {
43     errval_t err;
44
45     /* Give monitor the kernel capability */
46     struct capref dest, src;
47     dest.cnode = si->taskcn;
48     dest.slot  = TASKCN_SLOT_KERNELCAP;
49     src.cnode = cnode_task;
50     src.slot  = TASKCN_SLOT_KERNELCAP;
51     err = cap_copy(dest, src);
52     if (err_is_fail(err)) {
53         return err_push(err, INIT_ERR_COPY_KERNEL_CAP);
54     }
55
56     /* Give monitor the perfmon capability */
57     dest.cnode = si->taskcn;
58     dest.slot = TASKCN_SLOT_PERF_MON;
59     src.cnode = cnode_task;
60     src.slot = TASKCN_SLOT_PERF_MON;
61     err = cap_copy(dest, src);
62     if (err_is_fail(err)) {
63         return err_push(err, INIT_ERR_COPY_PERF_MON);
64     }
65
66     /* Give monitor modulecn */
67     dest.cnode = si->rootcn;
68     dest.slot  = ROOTCN_SLOT_MODULECN;
69     src.cnode = cnode_root;
70     src.slot  = ROOTCN_SLOT_MODULECN;
71     err = cap_copy(dest, src);
72     if (err_is_fail(err)) {
73         return err_push(err, INIT_ERR_COPY_MODULECN_CAP);
74     }
75
76     /* Give monitor physaddr cn */
77     dest.cnode = si->rootcn;
78     dest.slot  = ROOTCN_SLOT_PACN;
79     src.cnode = cnode_root;
80     src.slot  = ROOTCN_SLOT_PACN;
81     err = cap_copy(dest, src);
82     if (err_is_fail(err)) {
83         return err_push(err, INIT_ERR_COPY_PACN_CAP);
84     }
85
86 #if __x86_64__ || __i386__ || __k1om__
87     /* Give monitor IRQ */
88     dest.cnode = si->taskcn;
89     dest.slot  = TASKCN_SLOT_IRQ;
90     src.cnode = cnode_task;
91     src.slot  = TASKCN_SLOT_IRQ;
92     err = cap_copy(dest, src);
93     if (err_is_fail(err)) {
94         return err_push(err, INIT_ERR_COPY_IRQ_CAP);
95     }
96
97     /* Give monitor IO */
98     dest.cnode = si->taskcn;
99     dest.slot  = TASKCN_SLOT_IO;
100     src.cnode = cnode_task;
101     src.slot  = TASKCN_SLOT_IO;
102     err = cap_copy(dest, src);
103     if (err_is_fail(err)) {
104         return err_push(err, INIT_ERR_COPY_IO_CAP);
105     }
106 #endif // __x86_64__ || __i386__
107
108 #if __arm__
109     /* Give monitor IO */
110        dest.cnode = si->taskcn;
111        dest.slot  = TASKCN_SLOT_IO;
112        src.cnode = cnode_task;
113        src.slot  = TASKCN_SLOT_IO;
114        err = cap_copy(dest, src);
115        if (err_is_fail(err)) {
116            return err_push(err, INIT_ERR_COPY_IO_CAP);
117        }
118        /* Give monitor IRQ */
119            dest.cnode = si->taskcn;
120            dest.slot  = TASKCN_SLOT_IRQ;
121            src.cnode = cnode_task;
122            src.slot  = TASKCN_SLOT_IRQ;
123            err = cap_copy(dest, src);
124            if (err_is_fail(err)) {
125                return err_push(err, INIT_ERR_COPY_IRQ_CAP);
126            }
127 #endif
128
129 #ifdef CONFIG_INTERCONNECT_DRIVER_UMP
130 #if 0   // XXX: Disabled until SCC has a decent memory allocator
131     /* Give monitor the foreign frame capability */
132     dest.cnode = si->taskcn;
133     dest.slot  = TASKCN_SLOT_MON_URPC;
134     src.cnode = cnode_task;
135     src.slot  = TASKCN_SLOT_MON_URPC;
136     err = cap_copy(dest, src);
137     if (err_is_fail(err)) {
138         return err_push(err, INIT_ERR_COPY_UMP_CAP);
139     }
140 #endif
141 #endif // CONFIG_INTERCONNECT_DRIVER_UMP
142
143     return SYS_ERR_OK;
144 }