#include #include #include #include #include #include #include #include #include void load_binaries() { userspace = (uint32_t)kmalloc(10000); font = (struct font *)kmalloc(100000); ; // High quality shit uint8_t boot_drive_id = (uint8_t)(*((uint8_t *)0x9000)); if (boot_drive_id != 0xE0) { struct ata_interface *primary_master = new_ata(1, 0x1F0); marfs_init(primary_master); marfs_read_whole_file(4, (uint8_t *)userspace); marfs_read_whole_file(5, (uint8_t *)font); } else { char *font_p[] = { "FONT.BIN" }; struct iso9660_entity *font_e = ISO9660_get(font_p, 1); if (!font_e) panic("Font not found!"); ATAPI_granular_read(1 + (font_e->length / 2048), font_e->lba, (uint8_t *)font); kfree(font_e); char *user_p[] = { "USER.BIN" }; struct iso9660_entity *user_e = ISO9660_get(user_p, 1); if (!user_e) panic("Userspace binary not found!"); ATAPI_granular_read(1 + (user_e->length / 2048), user_e->lba, (uint8_t *)userspace); kfree(user_e); } vga_log("Successfully loaded binaries"); } #define MAX_LOADERS 16 loader_t **loaders = 0; uint8_t last_loader = 0; uint32_t last_load_loc = 0x400000; void loader_init() { serial_printf("Setting up loader"); loaders = (loader_t **)kmalloc(MAX_LOADERS * sizeof(uint32_t)); memset(loaders, 0, MAX_LOADERS * sizeof(uint32_t)); // _kill(); } void register_loader(loader_t *load) { if (last_loader + 1 > MAX_LOADERS) return; if (!load) return; loaders[last_loader] = load; last_loader++; serial_printf("Registered %s loader as id %d", load->name, last_loader - 1); } uint32_t loader_get_unused_load_location() { last_load_loc += 0x400000; return last_load_loc; } uint8_t exec_start(uint8_t *buf) { for (int i = 0; i < MAX_LOADERS; i++) { if (!loaders[i]) break; void *priv = loaders[i]->probe(buf); if (priv) { return loaders[i]->start(buf, priv); } } return 0; }