int main(int argc, char **argv) { #if USE_IRQ uint8_t status; #else bool first; #endif command(0xa8); // enable aux. PS2 command(0xf6); // load default config command(0xf4); // enable mouse command(0xf3); // set sample rate: outb(0x60, 10); // 10 samples per second #if USE_IRQ wait_signal(); outb(0x64, 0x20); status = inb(0x60); status &= ~0x20; // enable mouse clock status |= 0x02; // enable IRQ12 wait_signal(); outb(0x64, 0x60); wait_signal(); outb(0x60, status); wait_signal(); #endif rdi_init(); mouse = rdi_file_cons(robject_new_index(), ACCS_READ | ACCS_EVENT); #if USE_IRQ rdi_set_irq(12, mouse_irq); #endif fs_plink("/dev/mouse", RP_CONS(getpid(), mouse->index), NULL); msendb(RP_CONS(getppid(), 0), ACTION_CHILD); #if USE_IRQ _done(); #else while (1) { first = true; while ((inb(0x64) & 0x21) != 0x21) { if (first) { send_event_delta(dx, dy); send_event_button(buttons); dx = dy = 0; } first = false; sleep(); } read_byte(); } #endif return 0; }
int share(uint64_t rp, void *buf, size_t size, uint64_t offset, int prot) { struct msg *msg; int err; /* check alignment */ if ((uintptr_t) buf % PAGESZ) { return 1; } msg = aalloc(PAGESZ + size, PAGESZ); if (!msg) return 1; msg->source = RP_CONS(getpid(), 0); msg->target = rp; msg->length = PAGESZ - sizeof(struct msg) + size; msg->port = PORT_SHARE; msg->arch = ARCH_NAT; ((uint64_t*) msg->data)[0] = offset; page_self(buf, &msg->data[PAGESZ - sizeof(struct msg)], size); page_prot(&msg->data[PAGESZ - sizeof(struct msg)], size, prot); if (msend(msg)) return 1; msg = mwait(PORT_REPLY, rp); if (msg->length != 1) { err = 1; } else { err = msg->data[0]; } free(msg); return err; }
char *fs_list(uint64_t dir, int entry) { struct msg *msg; char *name; msg = aalloc(sizeof(struct msg) + sizeof(uint32_t), PAGESZ); if (!msg) return NULL; msg->source = RP_CONS(getpid(), 0); msg->target = dir; msg->length = sizeof(uint32_t); msg->port = PORT_LIST; msg->arch = ARCH_NAT; ((uint32_t*) msg->data)[0] = entry; if (msend(msg)) return NULL; msg = mwait(PORT_REPLY, dir); if (msg->length == 0) { free(msg); return NULL; } name = strdup((const char*) msg->data); free(msg); return name; }
int main(int argc, char **argv) { struct vfs_obj *root; uint64_t kbd; root = calloc(sizeof(struct vfs_obj), 1); root->type = RP_TYPE_FILE; root->size = 0; root->acl = acl_set_default(root->acl, PERM_WRITE | PERM_READ); vfs_set_index(0, root); tty_init(); kbd = io_find("/dev/kbd"); event_register(kbd, tty_event); di_wrap_read (tty_read); di_wrap_write(tty_write); di_wrap_rcall(tty_rcall); vfs_wrap_init(); msendb(RP_CONS(getppid(), 0), PORT_CHILD); _done(); return 0; }
int daemonize(void) { /* play dead */ msendb(RP_CONS(getppid(), 0), ACTION_CHILD); /* end current thread */ _done(); }
static uint64_t start(struct tar_file *file, char const **argv) { int32_t pid; pid = fork(); setenv("NAME", "unknown"); if (pid < 0) { execiv(file->start, file->size, argv); for(;;); } setenv("NAME", "init"); mwait(PORT_CHILD, RP_CONS(pid, 0)); return RP_CONS(pid, 0); }
static char *_find(struct robject *r, rp_t src, int argc, char **argv) { char *link; link = robject_get_data(r, "link"); if (argc == 2) { if (link) { return saprintf(">> %s", link); } else { return rtoa(RP_CONS(getpid(), r->index)); } } else if (argc == 3 && !strcmp(argv[1], "-L")) { return rtoa(RP_CONS(getpid(), r->index)); } return errorstr(EINVAL); }
int main(int argc, char **argv) { struct vfs_obj *root; char *modesstr0; char *modestr; int i; root = calloc(sizeof(struct vfs_obj), 1); root->type = RP_TYPE_FILE; root->size = 0; root->acl = acl_set_default(root->acl, PERM_READ | PERM_WRITE); vfs_set_index(0, root); svga_init(); // generate list of modes modesstr = strdup(""); for (i = 0; i < modelist_count; i++) { modesstr0 = modesstr; modestr = malloc(16); sprintf(modestr, "%d:%d:%d ", modelist[i].w, modelist[i].h, modelist[i].d); modesstr = strvcat(modesstr, modestr, NULL); free(modesstr0); } svga_set_mode(svga_find_mode(640, 480, 24)); buffer = malloc(svga.w * svga.h * 4); /* set up driver interface */ di_wrap_sync (svga_sync); di_wrap_share(svga_share); di_wrap_rcall(svga_rcall); di_wrap_read (svga_read); di_wrap_write(svga_write); vfs_wrap_init(); /* register the driver as /dev/svga0 */ io_link("/dev/svga0", RP_CONS(getpid(), 0)); msendb(RP_CONS(getppid(), 0), PORT_CHILD); _done(); return 0; }
int main(int argc, char **argv) { struct robject *canvas; char *modesstr0; char *modestr; int i; rdi_init(); canvas = rdi_file_cons(robject_new_index(), ACCS_READ | ACCS_WRITE | ACCS_EVENT); robject_set_data(canvas, "type", (void*) "canvas share"); svga_init(); // generate list of modes modesstr = strdup(""); for (i = 0; i < modelist_count; i++) { modesstr0 = modesstr; modestr = malloc(16); sprintf(modestr, "%d:%d:%d ", modelist[i].w, modelist[i].h, modelist[i].d); modesstr = strvcat(modesstr, modestr, NULL); free(modesstr0); } svga_set_mode(svga_find_mode(640, 480, 24)); buffer = malloc(svga.w * svga.h * 4); /* set up driver interface */ robject_set_call(canvas, "getmode", svga_rcall_getmode, STAT_READER); robject_set_call(canvas, "listmodes", svga_rcall_listmodes, STAT_READER); robject_set_call(canvas, "unshare", svga_rcall_unshare, STAT_WRITER); robject_set_call(canvas, "setmode", svga_rcall_setmode, STAT_WRITER); robject_set_call(canvas, "syncrect", svga_rcall_syncrect, STAT_WRITER); robject_set_call(canvas, "sync", svga_rcall_sync, STAT_WRITER); rdi_global_share_hook = svga_share; /* register the driver as /dev/svga0 */ fs_plink("/dev/svga0", RP_CONS(getpid(), canvas->index), NULL); msendb(RP_CONS(getppid(), 0), PORT_CHILD); _done(); return 0; }
int msendb(uint64_t target, uint8_t port) { struct msg *msg; msg = aalloc(sizeof(struct msg), PAGESZ); if (!msg) return 1; msg->source = RP_CONS(getpid(), 0); msg->target = target; msg->length = 0; msg->port = port; msg->arch = ARCH_NAT; return msend(msg); }
static uint64_t start(struct tar_file *file, char const **argv) { int32_t pid; pid = fork(); if (pid < 0) { execiv(file->start, file->size, argv); abort(); } mwait(PORT_CHILD, pid); return RP_CONS(pid, 1); }
void exit(int status) { struct __atexit_func *f; fflush(stderr); fflush(stdout); while (__atexit_func_list) { f = __atexit_func_list; f->function(); __atexit_func_list = f->next; free(f); } msendb(RP_CONS(getppid(), 0), PORT_CHILD); __exit(status); }
int event(rp_t rp, const char *value) { struct msg *msg; if (!value) value = ""; msg = aalloc(sizeof(struct msg) + strlen(value) + 1, PAGESZ); if (!msg) return 1; msg->source = RP_CONS(getpid(), 0); msg->target = rp; msg->length = strlen(value) + 1; msg->action = ACTION_EVENT; msg->arch = ARCH_NAT; strcpy((char*) msg->data, value); return msend(msg); }
int sync(uint64_t file) { struct msg *msg; msg = aalloc(sizeof(struct msg), PAGESZ); if (!msg) return 1; msg->source = RP_CONS(getpid(), 0); msg->target = file; msg->length = 0; msg->port = PORT_SYNC; msg->arch = ARCH_NAT; if (msend(msg)) return 1; msg = mwait(PORT_REPLY, file); free(msg); return 0; }
int main(int argc, char **argv) { struct robject *root; rdi_init(); // create device file root = rdi_core_cons(1, ACCS_READ | ACCS_WRITE); // set interface functions rdi_global_cons_file_hook = pipe_file_cons; rdi_global_write_hook = pipe_write; rdi_global_read_hook = pipe_read; // daemonize msendb(RP_CONS(getppid(), 0), ACTION_CHILD); _done(); return 0; }
int main(int argc, char **argv) { struct robject *root; rdi_init(); // create root directory root = rdi_dir_cons(robject_new_index(), ACCS_READ | ACCS_WRITE); // set interface functions robject_set_call(rdi_class_file, "reset", tmpfs_reset, AC_WRITE); rdi_global_read_hook = tmpfs_read; rdi_global_write_hook = tmpfs_write; rdi_global_cons_file_hook = tmpfs_file_cons; rdi_global_cons_dir_hook = tmpfs_dir_cons; rdi_global_cons_link_hook = tmpfs_link_cons; // daemonize msendb(RP_CONS(getppid(), 0), ACTION_CHILD); _done(); return 0; }
uint64_t ator(const char *str) { uint32_t index; uint32_t pid; char *substr; if (!str || str[0] != '@') { errno = EINVAL; return RP_NULL; } str++; // extract pid substr = struntil(str, ".", &str); pid = (uint32_t) atoi(substr); free(substr); str++; // extract index index = (uint32_t) atoi(str); return RP_CONS(pid, index); }
int main() { struct tar_file *boot_image, *file; char const **argv; uint64_t temp, temp1, temp2; argv = malloc(sizeof(char*) * 4); /* Boot Image */ boot_image = tar_parse((void*) BOOT_IMAGE); /* Dynamic Linker */ file = tar_find(boot_image, "lib/dl.so"); dl_load(file->start); /* Initial Root Filesystem / Device Filesystem / System Filesystem (tmpfs) */ argv[0] = "tmpfs"; argv[1] = NULL; file = tar_find(boot_image, "sbin/tmpfs"); fs_root = start(file, argv); fs_cons("/dev", "dir"); fs_cons("/sys", "dir"); /* Serial Driver */ argv[0] = "serial"; argv[1] = NULL; file = tar_find(boot_image, "sbin/serial"); fs_plink("/dev/serial", start(file, argv), NULL); ropen(1, fs_find("/dev/serial"), STAT_WRITER); ropen(2, fs_find("/dev/serial"), STAT_WRITER); stdout = fdopen(1, "w"); stderr = fdopen(2, "w"); fs_plink("/dev/stderr", fs_find("/dev/serial"), NULL); /* Keyboard Driver */ argv[0] = "kbd"; argv[1] = NULL; file = tar_find(boot_image, "sbin/kbd"); temp = start(file, argv); /* Graphics Driver */ argv[0] = "svga"; argv[1] = NULL; file = tar_find(boot_image, "sbin/svga"); start(file, argv); /* Init control file */ fs_plink("/sys/init", RP_CONS(getpid(), 0), NULL); /* Initrd */ initrd_init(); fs_plink("/dev/initrd", RP_CONS(getpid(), 1), NULL); /* Root filesystem (tarfs) */ argv[0] = "tarfs"; argv[1] = "/dev/initrd"; argv[2] = NULL; file = tar_find(boot_image, "sbin/tarfs"); temp = start(file, argv); /* Link /dev and /sys and change root */ temp1 = fs_find("/dev"); temp2 = fs_find("/sys"); fs_root = temp; fs_plink("/dev", temp1, NULL); fs_plink("/sys", temp2, NULL); /* Terminal Driver */ argv[0] = "biterm"; argv[1] = "/dev/kbd"; argv[2] = "/dev/svga0"; argv[3] = NULL; file = tar_find(boot_image, "sbin/biterm"); fs_plink("/dev/tty", start(file, argv), NULL); /* Temporary filesystem */ argv[0] = "tmpfs"; argv[1] = NULL; file = tar_find(boot_image, "sbin/tmpfs"); fs_plink("/tmp", start(file, argv), NULL); /* Time Driver */ argv[0] = "time"; argv[1] = NULL; file = tar_find(boot_image, "sbin/time"); fs_plink("/dev/time", start(file, argv), NULL); /* Pipe Driver */ argv[0] = "pipe"; argv[1] = NULL; file = tar_find(boot_image, "sbin/pipe"); fs_plink("/sys/pipe", start(file, argv), NULL); setname("init"); mwait(PORT_CHILD, 0); printf("INIT PANIC: system daemon died\n"); for(;;); return 0; }
int main() { struct tar_file *boot_image, *file; char const **argv; uint64_t temp, temp1, temp2; argv = malloc(sizeof(char*) * 4); /* Boot Image */ boot_image = tar_parse((void*) BOOT_IMAGE); /* Dynamic Linker */ file = tar_find(boot_image, "lib/dl.so"); dl_load(file->start); /* Initial Root Filesystem / Device Filesystem / System Filesystem (tmpfs) */ argv[0] = "tmpfs"; argv[1] = NULL; file = tar_find(boot_image, "sbin/tmpfs"); fs_root = start(file, argv); io_cons("/dev", RP_TYPE_DIR); io_cons("/sys", RP_TYPE_DIR); /* Logfile */ io_cons("/dev/stderr", RP_TYPE_FILE); /* Init control file */ io_link("/sys/init", RP_CONS(getpid(), 1)); /* Keyboard Driver */ argv[0] = "kbd"; argv[1] = NULL; file = tar_find(boot_image, "sbin/kbd"); temp = start(file, argv); /* Terminal Driver */ argv[0] = "tty"; argv[1] = NULL; file = tar_find(boot_image, "sbin/tty"); temp = start(file, argv); io_link("/dev/tty", temp); /* Splash */ stdin = stderr = stdout = fopen("/dev/tty", "w"); printf(splash); /* Initrd */ initrd_init(); io_link("/dev/initrd", RP_CONS(getpid(), 0)); /* Root filesystem (tarfs) */ argv[0] = "tarfs"; argv[1] = "/dev/initrd"; argv[2] = NULL; file = tar_find(boot_image, "sbin/tarfs"); temp = start(file, argv); /* Link /dev and /sys and change root */ temp1 = io_find("/dev"); temp2 = io_find("/sys"); fs_root = temp; io_link("/dev", temp1); io_link("/sys", temp2); /* Temporary filesystem */ argv[0] = "tmpfs"; argv[1] = NULL; file = tar_find(boot_image, "sbin/tmpfs"); io_link("/tmp", start(file, argv)); /* Time Driver */ argv[0] = "time"; argv[1] = NULL; file = tar_find(boot_image, "sbin/time"); io_link("/dev/time", start(file, argv)); /* Serial Driver */ argv[0] = "serial"; argv[1] = NULL; file = tar_find(boot_image, "sbin/serial"); io_link("/dev/serial", start(file, argv)); /* Path */ setenv("PATH", "/bin"); /* Flux Init Shell */ argv[0] = "fish"; argv[1] = NULL; file = tar_find(boot_image, "bin/fish"); if (!file) { printf("critical error: no init shell found\n"); for(;;); } if (fork() < 0) { // setcuser(1); execiv(file->start, file->size, argv); } setenv("NAME", "init"); mwait(PORT_CHILD, 0); printf("INIT PANIC: system daemon died\n"); for(;;); return 0; }
int main(int argc, char **argv) { struct tar_block *block; struct robject *root; struct robject *file; size_t i, n; off_t *poff, *size; /* reject if no parent is speicified */ if (argc < 2) { fprintf(stderr, "%s: no parent driver specified\n", argv[0]); abort(); } else { /* get parent driver stream */ parent = fopen(argv[1], "r"); if (!parent) { /* parent does not exist - fail */ fprintf(stderr, "%s: no parent driver %s\n", argv[0], argv[1]); abort(); } } rdi_init(); /* create root directory */ root = rdi_dir_cons(robject_new_index(), ACCS_READ | ACCS_WRITE); /* allocate buffer space for header block */ block = malloc(512); for (i = 0, n = 1;; n++) { /* read in file header block */ fseek(parent, i, SEEK_SET); fread(block, 1, 512, parent); /* break if it's a terminating block */ if (block->filename[0] == '\0' || block->filename[0] == ' ') { break; } if (block->filename[strlen(block->filename) - 1] == '/') { /* add directory to VFS */ block->filename[strlen(block->filename) - 1] = 0; file = rdi_dir_cons(robject_new_index(), ACCS_READ | ACCS_WRITE); rdi_vfs_add(root, block->filename, file); /* move to next file header */ i += 512; } else { /* add file to VFS */ file = rdi_file_cons(robject_new_index(), ACCS_READ); rdi_vfs_add(root, block->filename, file); poff = malloc(sizeof(off_t)); size = malloc(sizeof(off_t)); *poff = i + 512; *size = getvalue(block->filesize, 12); robject_set_data(file, "size", size); robject_set_data(file, "parent-offset", poff); /* move to next file header */ i += ((*size / 512) + 1) * 512; if (*size % 512) i += 512; } } free(block); /* set up interface */ rdi_global_read_hook = tarfs_read; rdi_global_cons_link_hook = tarfs_link_cons; /* daemonize */ msendb(RP_CONS(getppid(), 0), ACTION_CHILD); _done(); return EXIT_SUCCESS; }