static inline errval_t invoke_frame_identify(struct capref frame,
struct frame_identity *ret)
{
- uint8_t invoke_bits = get_cap_valid_bits(frame);
- capaddr_t invoke_cptr = get_cap_addr(frame) >> (CPTR_BITS - invoke_bits);
-
- struct sysret sysret =
- syscall2((invoke_bits << 16) | (FrameCmd_Identify << 8)
- | SYSCALL_INVOKE, invoke_cptr);
+ struct sysret sysret = cap_invoke1(frame, FrameCmd_Identify);
assert(ret != NULL);
if (err_is_ok(sysret.error)) {
break;
}
+ if (kcb_current == 0x0) {
+ panic("Did not receive a valid KCB.");
+ }
+
if(magic != KERNEL_BOOT_MAGIC) {
// Construct the global structure and store its address to retrive it
// across relocation
}
#endif
+static struct sysret handle_kcb_identify(struct capability *to,
+ int cmd, uintptr_t *args)
+{
+ // Return with physical base address of frame
+ // XXX: pack size into bottom bits of base address
+ assert(to->type == ObjType_KernelControlBlock);
+ lvaddr_t vkcb = (lvaddr_t) to->u.kernelcontrolblock.kcb;
+ assert((vkcb & BASE_PAGE_MASK) == 0);
+ return (struct sysret) {
+ .error = SYS_ERR_OK,
+ .value = mem_to_local_phys(vkcb) | OBJBITS_KCB,
+ };
+}
+
static struct sysret handle_io(struct capability *to, int cmd, uintptr_t *args)
{
uint32_t port = args[0];
[DispatcherCmd_PerfMon] = handle_dispatcher_perfmon,
[DispatcherCmd_DumpPTables] = dispatcher_dump_ptables,
},
+ [ObjType_KernelControlBlock] = {
+ [FrameCmd_Identify] = handle_kcb_identify,
+ },
[ObjType_Frame] = {
[FrameCmd_Identify] = handle_frame_identify,
[FrameCmd_ModifyFlags] = handle_frame_modify_flags,
initialize();
int ret = -1;
- DEBUG("x86boot start");
+ DEBUG("x86boot start\n");
// ENSURE_SEQUENTIAL
errval_t err;
}
//
- DEBUG("x86boot got lock");
+ DEBUG("x86boot got lock\n");
// Parse arguments, call handler function
int c;
while (1) {
struct frame_identity fid;
- invoke_frame_identify(kcb, &fid);
+ err = invoke_frame_identify(kcb, &fid);
+ if (err_is_fail(err)) {
+ USER_PANIC_ERR(err, "Invoke frame identity for KCB failed. "
+ "Did you add the syscall handler for that architecture?");
+ }
DEBUG("%s:%s:%d: fid.base is 0x%"PRIxGENPADDR"\n",
__FILE__, __FUNCTION__, __LINE__, fid.base);
core_data->kcb = (genpaddr_t) fid.base;
-
#ifdef CONFIG_FLOUNDER_BACKEND_UMP_IPI
core_data->chan_id = chanid;
#endif
if (mi != NULL) {
err = mi->start_function(0, mi, record);
if (err_is_fail(err)) {
- USER_PANIC_ERR(err, "start function failed.");
+ printf("Boot driver not found. Do not boot discovered CPU %"PRIu64".\n",
+ barrelfish_id);
+ goto out;
}
assert(err_is_ok(err));
}