more kernel elf loader hacking.
[newos.git] / kernel / dev.c
blobe5b37495fb6aeb059e4997bed9154c761b6ef02c
1 /*
2 ** Copyright 2001, Travis Geiselbrecht. All rights reserved.
3 ** Distributed under the terms of the NewOS License.
4 */
5 #include <kernel/kernel.h>
6 #include <boot/stage2.h>
7 #include <kernel/dev.h>
8 #include <kernel/vfs.h>
9 #include <kernel/debug.h>
10 #include <kernel/elf.h>
12 #include <stdio.h>
14 int dev_init(kernel_args *ka)
16 dprintf("dev_init: entry\n");
18 return 0;
21 int dev_scan_drivers(kernel_args *ka)
23 int fd;
24 int err;
26 fd = sys_open("/boot/addons/dev", STREAM_TYPE_DIR, 0);
27 if(fd >= 0) {
28 ssize_t len;
29 char buf[SYS_MAX_NAME_LEN];
31 while((len = sys_read(fd, buf, 0, sizeof(buf))) > 0) {
32 dprintf("loading '%s' dev module\n", buf);
33 dev_load_dev_module(buf);
35 sys_close(fd);
40 image_id dev_load_dev_module(const char *name)
42 image_id id;
43 void (*bootstrap)();
44 char path[SYS_MAX_PATH_LEN];
46 sprintf(path, "/boot/addons/dev/%s", name);
48 id = elf_load_kspace(path, "");
49 if(id < 0)
50 return id;
52 bootstrap = (void *)elf_lookup_symbol(id, "dev_bootstrap");
53 if(!bootstrap)
54 return ERR_VFS_INVALID_FS;
56 bootstrap();
58 return id;