rudimentary initrc parser
This commit is contained in:
parent
95f55f1623
commit
97708379f6
|
|
@ -1,3 +1,5 @@
|
|||
echo "This is a test"
|
||||
|
||||
panic
|
||||
ECHO "Initrc for Kimi's OS"
|
||||
MODULE boot/idm.elf
|
||||
MODULE boot/ifsm.elf
|
||||
# This is a comment
|
||||
END # does nothing but make the whole thing slightly more efficient
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ int pm_init(kernel_info_t *kernel_info){
|
|||
for(uint32_t i = 0; i < mmap_count; i++){
|
||||
pm_map[i] = 0xff;
|
||||
}
|
||||
mlog("KERNEL", " BASE | LENGTH | TYPE\n --------|--------|----\n", MLOG_PRINT);
|
||||
// mlog("KERNEL", " BASE | LENGTH | TYPE\n --------|--------|----\n", MLOG_PRINT);
|
||||
for(uint32_t i = 0; i < kernel_info->mmap_entry_count; i++){
|
||||
for(uint32_t j = 0; j < (mmap[i].entry_length >> 12); j++){
|
||||
if(mmap[i].entry_base + (j << 12) <= mmap[i-1].entry_base + mmap[i-1].entry_length){
|
||||
|
|
@ -83,7 +83,7 @@ int pm_init(kernel_info_t *kernel_info){
|
|||
// printf("%d, %x, %d\n", j >> 3, pm_map[(mmap[i].entry_base >> 12 ) + (j >> 3)], mmap[i].type);
|
||||
// }
|
||||
}
|
||||
mlog("KERNEL", " %x|%x|%d\n", MLOG_PRINT, (uint32_t)mmap[i].entry_base, (uint32_t)mmap[i].entry_length, mmap[i].type);
|
||||
// mlog("KERNEL", " %x|%x|%d\n", MLOG_PRINT, (uint32_t)mmap[i].entry_base, (uint32_t)mmap[i].entry_length, mmap[i].type);
|
||||
// printf("%x", mmap[i].entry_length);
|
||||
// printf("|%d |\n", mmap[i].type);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,16 +27,17 @@ int read_initrd(initrd_t *initrd){
|
|||
// *out = ptr + 512;
|
||||
// return filesize;
|
||||
// }
|
||||
// printf("size: %d", sizeof(USTAR_file_t));
|
||||
uint32_t fsize_pgs = (((filesize + 4095)/4096) + 1);
|
||||
// uint32_t *ptr = kmalloc(fsize_pgs);
|
||||
|
||||
// for(uint32_t i = 0; i < (filesize/4) + 1; i++){
|
||||
// ptr[i] = ((uint32_t *)(archive + offset))[i];
|
||||
// ptr[i] = ((uint32_t *)(archive + offset + sizeof(USTAR_file_t)))[i];
|
||||
// if(fsize_pgs == 2)printf("%x", ptr[i]);
|
||||
// }
|
||||
char final_fname[80] = "/boot/";
|
||||
strcat(file->filename, final_fname);
|
||||
fcreate(final_fname, VFILE_POINTER, archive + offset + sizeof(USTAR_file_t), fsize_pgs);
|
||||
printf("%s, %d, %d\n", final_fname, filesize, fsize_pgs);
|
||||
fcreate(final_fname, VFILE_POINTER, (archive + offset + sizeof(USTAR_file_t)), fsize_pgs);
|
||||
// printf("%s, %d, %d\n", final_fname, filesize, fsize_pgs);
|
||||
offset += (((filesize + 511) / 512) + 1) * 512;
|
||||
}
|
||||
}
|
||||
|
|
@ -3,12 +3,12 @@
|
|||
#include "../shared/kstdlib.h"
|
||||
typedef struct{
|
||||
char filename[100];
|
||||
uint64_t mode;
|
||||
uint64_t owner_uid;
|
||||
uint64_t group_uid;
|
||||
char mode[8];
|
||||
char owner_uid[8];
|
||||
char group_uid[8];
|
||||
char fsize[12];
|
||||
char last_modified[12];
|
||||
uint64_t checksum;
|
||||
char checksum[8];
|
||||
uint8_t type;
|
||||
char linked_file[100];
|
||||
char ustar[6];
|
||||
|
|
@ -18,6 +18,7 @@ typedef struct{
|
|||
char dev_major[8];
|
||||
char dev_minor[8];
|
||||
char filename_prefix[155];
|
||||
char reserved[12];
|
||||
}__attribute__((packed)) USTAR_file_t;
|
||||
|
||||
enum USTAR_TYPES{
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#include "system/elf.h"
|
||||
#include "system/vfs.h"
|
||||
#include "drivers/ustar.h"
|
||||
#include "system/initrc.h"
|
||||
|
||||
kernel_info_t *boot_info = 0;
|
||||
|
||||
|
|
@ -23,6 +24,11 @@ void sysinit(){
|
|||
// modules_init(boot_info, 0);
|
||||
read_initrd(boot_info->initrd);
|
||||
vfile_t *initrc = fopen("/boot/initrc.conf");
|
||||
if(initrc){
|
||||
mlog("KERNEL", "Found initrc at: %x\n", MLOG_PRINT, initrc->access.data.ptr);
|
||||
}
|
||||
modules_init();
|
||||
initrc_read(initrc);
|
||||
// uint8_t *buffer = kmalloc(1);
|
||||
// int status = fread(drive_test, buffer, 0, 4096);
|
||||
// if(status == -1){
|
||||
|
|
@ -40,13 +46,13 @@ void sysinit(){
|
|||
extern void kmain(kernel_info_t *kernel_info){
|
||||
serial_init();
|
||||
pm_init(kernel_info);
|
||||
vfs_init();
|
||||
mlog("KERNEL", "Initializing IDT\n", MLOG_PRINT);
|
||||
idt_load();
|
||||
pic_init(0x20);
|
||||
pic_disable();
|
||||
pic_setmask(0x0, PIC1_DATA);
|
||||
pic_setmask(0x0, PIC2_DATA);
|
||||
vfs_init();
|
||||
|
||||
fcreate("/dev", VFILE_DIRECTORY, kmalloc(1), 1);
|
||||
fcreate("/dev/disk", VFILE_DIRECTORY, kmalloc(1), 1);
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
void initrc_read(char *file);
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
#include "../shared/kstdlib.h"
|
||||
#include "../shared/memory.h"
|
||||
#include "../shared/string.h"
|
||||
#include "modules.h"
|
||||
#include "vfs.h"
|
||||
|
||||
//COMMANDS TO WRITE:
|
||||
//link: create symlink from one file to another (useful for actually selecting where to mount things)
|
||||
//exec: execute program in userspace
|
||||
|
||||
|
||||
void initrc_read(vfile_t *file){
|
||||
mlog("KERNEL", "Reading initrc:\n", MLOG_PRINT);
|
||||
char *ptr = file->access.data.ptr;
|
||||
uint32_t size = file->access.data.size_pgs * 4096;
|
||||
char statement[512];
|
||||
uint32_t i = 0;
|
||||
while(strcmp(statement, "END")){
|
||||
uint32_t s_i = 0;
|
||||
while(ptr[i] != ' ' && ptr[i] != '\n' && ptr[i]){
|
||||
statement[s_i++] = ptr[i];
|
||||
i++;
|
||||
}
|
||||
statement[s_i]=0;
|
||||
if(statement[0] == '#'){
|
||||
while(ptr[i] != '\n' && ptr[i]){
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if(!strcmp(statement, "ECHO")){
|
||||
//this is purely for testing purposes.
|
||||
i++;
|
||||
while(ptr[i] != '\n' && ptr[i]){
|
||||
if(ptr[i] != '\"'){
|
||||
printf("%c", ptr[i]);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
if(!strcmp(statement, "MODULE")){
|
||||
i++;
|
||||
char module_name[512];
|
||||
int j = 0;
|
||||
for(; j < 512 && ptr[i + j] && ptr[i+j] != '\n'; j++){
|
||||
module_name[j] = ptr[i + j];
|
||||
}
|
||||
i+=j;
|
||||
module_name[j] = 0;
|
||||
// printf("%s\n", module_name);
|
||||
vfile_t *module = fopen(module_name);
|
||||
if(!module){
|
||||
printf("Error: Could not find module in Initrc.conf: %s\n", module_name);
|
||||
continue;
|
||||
}
|
||||
module_start(module->access.data.ptr);
|
||||
}
|
||||
// printf("%d\n", i);
|
||||
if(i >= size){
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
|
@ -128,7 +128,10 @@ uint32_t module_api(uint32_t func, ...){
|
|||
va_end(vars);
|
||||
return return_value;
|
||||
}
|
||||
|
||||
void module_start(void *ptr){
|
||||
void (*entry)(void* api, uint32_t version) = load_elf(ptr, PT_SYS);
|
||||
(*entry)(module_api, 0);
|
||||
}
|
||||
void modules_init(){
|
||||
mlog(MODULE_NAME, "Initializing Boot-Time Modules\n", MLOG_PRINT);
|
||||
// kernel_module_t *module = kernel_info->loaded_modules;
|
||||
|
|
|
|||
|
|
@ -43,4 +43,5 @@ typedef struct module{
|
|||
void (*fini)(void);
|
||||
}module_t;
|
||||
|
||||
void modules_init();
|
||||
void modules_init();
|
||||
void module_start(void *ptr);
|
||||
|
|
@ -79,7 +79,8 @@ vfile_t *fcreate(char *name, VFILE_TYPE type, ...){
|
|||
void *ptr = va_arg(args, void*);
|
||||
vfile->access.data.ptr = ptr;
|
||||
vfile->access.data.size_pgs = va_arg(args, uint32_t);
|
||||
*(uint32_t *)ptr = 0;
|
||||
// *(uint32_t *)(ptr + (vfile->access.data.size_pgs * 4096)) = 0;
|
||||
// what was the above line even for
|
||||
add_file(vfile, current_dir);
|
||||
break;
|
||||
case VFILE_FILE:
|
||||
|
|
|
|||
Loading…
Reference in New Issue