int l4x_kvm_create_vm(struct kvm *kvm) { l4_msgtag_t t; l4_utcb_t *u = l4_utcb(); int r; L4XV_V(f); kvm->arch.l4vmcap = L4_INVALID_CAP; if (l4lx_task_get_new_task(L4_INVALID_CAP, &kvm->arch.l4vmcap)) { printk("%s: could not allocate task cap\n", __func__); return -ENOENT; } L4XV_L(f); t = l4_factory_create_vm_u(l4re_env()->factory, kvm->arch.l4vmcap, u); if (unlikely((r = l4_error_u(t, u)))) { printk("%s: kvm task creation failed cap=%08lx: %d\n", __func__, kvm->arch.l4vmcap, r); l4lx_task_number_free(kvm->arch.l4vmcap); L4XV_U(f); return -ENOENT; } L4XV_U(f); printk("%s: cap = %08lx\n", __func__, kvm->arch.l4vmcap); #ifdef CONFIG_L4_DEBUG_REGISTER_NAMES L4XV_L(f); l4_debugger_set_object_name(kvm->arch.l4vmcap, "kvmVM"); L4XV_U(f); #endif return 0; }
static int kp_irq_func(void) { l4_cap_idx_t irq_cap = l4re_util_cap_alloc(); l4_cap_idx_t thread_cap = pthread_getl4cap(_pthread); l4_msgtag_t tag; l4_debugger_set_object_name(thread_cap, "kp-omap3.irq"); if (l4io_request_irq(7, irq_cap) < 0) return -2; // was L4_IRQ_F_LEVEL_LOW tag = l4_irq_attach(irq_cap, 0, thread_cap); if (l4_ipc_error(tag, l4_utcb())) return -3; while (1) { tag = l4_irq_receive(irq_cap, L4_IPC_NEVER); if (l4_ipc_error(tag, l4_utcb())) { printf("[KEYP] Error: Receive irq failed\n"); continue; } kp_write(REG_KEYP_IMR1, 0xf); if (kp_handler) scan_key(); l4_uint8_t value = 0; kp_read(REG_KEYP_ISR1, &value); kp_write(REG_KEYP_IMR1, 0x0); } }
static void *thread_producer(void *d) { (void)d; l4shmc_chunk_t p_one; l4shmc_signal_t s_one, s_done; l4shmc_area_t shmarea; l4_debugger_set_object_name(pthread_getl4cap(pthread_self()), "prod"); // attach this thread to the shm object CHK(l4shmc_attach("testshm", &shmarea)); // add a chunk CHK(l4shmc_add_chunk(&shmarea, "one", 1024, &p_one)); // add a signal CHK(l4shmc_add_signal(&shmarea, "prod", &s_one)); // connect chunk and signal CHK(l4shmc_connect_chunk_signal(&p_one, &s_one)); CHK(l4shmc_attach_signal_to(&shmarea, "done", pthread_getl4cap(pthread_self()), 10000, &s_done)); printf("PRODUCER: ready\n"); while (1) { while (l4shmc_chunk_try_to_take(&p_one)) printf("Uh, should not happen!\n"); //l4_thread_yield(); set_some_data(); memcpy(l4shmc_chunk_ptr(&p_one), some_data, sizeof(some_data)); CHK(l4shmc_chunk_ready_sig(&p_one, sizeof(some_data))); printf("PRODUCER: Sent data %s\n", some_data); CHK(l4shmc_wait_signal(&s_done)); l4_sleep(5000); } l4_sleep_forever(); return NULL; }
int main(void) { l4_msgtag_t tag; #ifdef MEASURE l4_cpu_time_t s, e; #endif l4_utcb_t *u = l4_utcb(); l4_exc_regs_t exc; l4_umword_t mr0, mr1; printf("Alien feature testing\n"); l4_debugger_set_object_name(l4re_env()->main_thread, "alientest"); /* Start alien thread */ if (l4_is_invalid_cap(alien = l4re_util_cap_alloc())) return 1; l4_touch_rw(alien_thread_stack, sizeof(alien_thread_stack)); tag = l4_factory_create_thread(l4re_env()->factory, alien); if (l4_error(tag)) return 1; l4_debugger_set_object_name(alien, "alienth"); l4_thread_control_start(); l4_thread_control_pager(l4re_env()->main_thread); l4_thread_control_exc_handler(l4re_env()->main_thread); l4_thread_control_bind((l4_utcb_t *)l4re_env()->first_free_utcb, L4RE_THIS_TASK_CAP); l4_thread_control_alien(1); tag = l4_thread_control_commit(alien); if (l4_error(tag)) return 2; tag = l4_thread_ex_regs(alien, (l4_umword_t)alien_thread, (l4_umword_t)alien_thread_stack + sizeof(alien_thread_stack), 0); if (l4_error(tag)) return 3; l4_sched_param_t sp = l4_sched_param(1, 0); tag = l4_scheduler_run_thread(l4re_env()->scheduler, alien, &sp); if (l4_error(tag)) return 4; #ifdef MEASURE l4_calibrate_tsc(l4re_kip()); #endif /* Pager/Exception loop */ if (l4_msgtag_has_error(tag = l4_ipc_receive(alien, u, L4_IPC_NEVER))) { printf("l4_ipc_receive failed"); return 1; } memcpy(&exc, l4_utcb_exc(), sizeof(exc)); mr0 = l4_utcb_mr()->mr[0]; mr1 = l4_utcb_mr()->mr[1]; for (;;) { #ifdef MEASURE s = l4_rdtsc(); #endif if (l4_msgtag_is_exception(tag)) { #ifndef MEASURE printf("PC=%08lx SP=%08lx Err=%08lx Trap=%lx, %s syscall, SC-Nr: %lx\n", l4_utcb_exc_pc(&exc), exc.sp, exc.err, exc.trapno, (exc.err & 4) ? " after" : "before", exc.err >> 3); #endif tag = l4_msgtag((exc.err & 4) ? 0 : L4_PROTO_ALLOW_SYSCALL, L4_UTCB_EXCEPTION_REGS_SIZE, 0, 0); } else printf("Umm, non-handled request (like PF): %lx %lx\n", mr0, mr1); memcpy(l4_utcb_exc(), &exc, sizeof(exc)); /* Reply and wait */ if (l4_msgtag_has_error(tag = l4_ipc_call(alien, u, tag, L4_IPC_NEVER))) { printf("l4_ipc_call failed\n"); return 1; } memcpy(&exc, l4_utcb_exc(), sizeof(exc)); mr0 = l4_utcb_mr()->mr[0]; mr1 = l4_utcb_mr()->mr[1]; #ifdef MEASURE e = l4_rdtsc(); printf("time %lld\n", l4_tsc_to_ns(e - s)); #endif }