Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
Arquivo: share.c Projeto: UIKit0/flux
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
Arquivo: main.c Projeto: UIKit0/flux
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;
}
Exemplo n.º 5
0
int daemonize(void) {

	/* play dead */
	msendb(RP_CONS(getppid(), 0), ACTION_CHILD);

	/* end current thread */
	_done();
}
Exemplo n.º 6
0
Arquivo: main.c Projeto: UIKit0/flux
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);
}
Exemplo n.º 7
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);
}
Exemplo n.º 8
0
Arquivo: main.c Projeto: UIKit0/flux
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;
}
Exemplo n.º 9
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;
}
Exemplo n.º 10
0
Arquivo: msendb.c Projeto: UIKit0/flux
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);
}
Exemplo n.º 11
0
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);
}
Exemplo n.º 12
0
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);
} 
Exemplo n.º 13
0
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);
}
Exemplo n.º 14
0
Arquivo: sync.c Projeto: UIKit0/flux
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;
}
Exemplo n.º 15
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;
}
Exemplo n.º 16
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;
}
Exemplo n.º 17
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);
}
Exemplo n.º 18
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);
	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;
}
Exemplo n.º 19
0
Arquivo: main.c Projeto: UIKit0/flux
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;
}
Exemplo n.º 20
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;
}