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