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 */
20errval_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
41errval_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.0 the BSP KCB capability */
57    dest.cnode = si->rootcn;
58    dest.slot  = ROOTCN_SLOT_BSPKCB;
59    src.cnode = cnode_root;
60    src.slot  = ROOTCN_SLOT_BSPKCB;
61    err = cap_copy(dest, src);
62    if (err_is_fail(err)) {
63        return err_push(err, INIT_ERR_COPY_BSP_KCB);
64    }
65
66    /* Give monitor the perfmon capability */
67    dest.cnode = si->taskcn;
68    dest.slot = TASKCN_SLOT_PERF_MON;
69    src.cnode = cnode_task;
70    src.slot = TASKCN_SLOT_PERF_MON;
71    err = cap_copy(dest, src);
72    if (err_is_fail(err)) {
73        return err_push(err, INIT_ERR_COPY_PERF_MON);
74    }
75
76    /* Give monitor the IPI capability */
77    dest.cnode = si->taskcn;
78    dest.slot = TASKCN_SLOT_IPI;
79    src.cnode = cnode_task;
80    src.slot = TASKCN_SLOT_IPI;
81    err = cap_copy(dest, src);
82    if (err_is_fail(err)) {
83        return err_push(err, INIT_ERR_COPY_IPI);
84    }
85
86    /* Give monitor the ProcessManager capability */
87    dest.cnode = si->taskcn;
88    dest.slot = TASKCN_SLOT_PROC_MNG;
89    src.cnode = cnode_task;
90    src.slot = TASKCN_SLOT_PROC_MNG;
91    err = cap_copy(dest, src);
92    if (err_is_fail(err)) {
93        return err_push(err, INIT_ERR_COPY_PROC_MNG_CAP);
94    }
95
96    /* Give monitor modulecn */
97    dest.cnode = si->rootcn;
98    dest.slot  = ROOTCN_SLOT_MODULECN;
99    src.cnode = cnode_root;
100    src.slot  = ROOTCN_SLOT_MODULECN;
101    err = cap_copy(dest, src);
102    if (err_is_fail(err)) {
103        return err_push(err, INIT_ERR_COPY_MODULECN_CAP);
104    }
105
106    /* Give monitor physaddr cn */
107    dest.cnode = si->rootcn;
108    dest.slot  = ROOTCN_SLOT_PACN;
109    src.cnode = cnode_root;
110    src.slot  = ROOTCN_SLOT_PACN;
111    err = cap_copy(dest, src);
112    if (err_is_fail(err)) {
113        return err_push(err, INIT_ERR_COPY_PACN_CAP);
114    }
115
116    /* Give monitor IRQ */
117    dest.cnode = si->taskcn;
118    dest.slot  = TASKCN_SLOT_IRQ;
119    src.cnode = cnode_task;
120    src.slot  = TASKCN_SLOT_IRQ;
121    err = cap_copy(dest, src);
122    if (err_is_fail(err)) {
123        return err_push(err, INIT_ERR_COPY_IRQ_CAP);
124    }
125
126#if !defined(__ARM_ARCH_8A__)
127    /* Give monitor IO */
128    dest.cnode = si->taskcn;
129    dest.slot  = TASKCN_SLOT_IO;
130    src.cnode = cnode_task;
131    src.slot  = TASKCN_SLOT_IO;
132    err = cap_copy(dest, src);
133    if (err_is_fail(err)) {
134        return err_push(err, INIT_ERR_COPY_IO_CAP);
135    }
136#endif
137
138#ifdef __k1om__
139    /* Give monitor system memory cap */
140    dest.cnode = si->taskcn;
141    dest.slot  = TASKCN_SLOT_SYSMEM;
142    src.cnode = cnode_task;
143    src.slot  = TASKCN_SLOT_SYSMEM;
144    err = cap_copy(dest, src);
145    if (err_is_fail(err)) {
146        return err_push(err, INIT_ERR_COPY_IO_CAP);
147    }
148
149    dest.cnode = si->taskcn;
150    dest.slot  = TASKCN_SLOT_COREBOOT;
151    src.cnode = cnode_task;
152    src.slot  = TASKCN_SLOT_COREBOOT;
153    err = cap_copy(dest, src);
154    if (err_is_fail(err)) {
155        return err_push(err, INIT_ERR_COPY_IO_CAP);
156    }
157#endif
158
159    return SYS_ERR_OK;
160}
161