13 #include <lib/php/explode.h>
14 #include <sys/unwind.h>
18 #include "drv/audio/ac97.h"
23 #include "net/stack.h"
24 #include "drv/audio/hda.h"
25 #include "lib/ttf_font.h"
26 #include "sys/grub_modules.h"
27 #include "drv/disk/mbr.h"
28 #include "sys/file_descriptors.h"
29 #include "sys/lapic.h"
32 #include "gfx/intel.h"
33 #include "ports/eBat/eBat.h"
34 #include "ports/eBat/eBatRuntime.h"
37 #include <lib/pixel.h>
39 #define INITRD_RW_SIZE (1474560)
41 extern bool ps2_channel2_okay;
43 uint32_t init_esp = 0;
45 bool test_floppy =
true;
46 bool test_network =
true;
49 size_t kernel_start_time = 0;
52 void jse_file_getBuff(
char* buf);
57 variable_write(
"HOSTNAME",
"SAYORISOUL");
58 variable_write(
"SYSTEMROOT",
"R:\\Sayori\\");
59 variable_write(
"TEMP",
"T:\\");
60 variable_write(
"USERNAME",
"OEM");
61 variable_write(
"BUILDUSER", BUILDUSER);
62 variable_write(
"BUILDDATA", __TIMESTAMP__);
63 variable_write(
"VERSION_MAJOR", TOSTRING(VERSION_MAJOR));
64 variable_write(
"VERSION_MINOR", TOSTRING(VERSION_MINOR));
65 variable_write(
"VERSION_PATCH", TOSTRING(VERSION_PATCH));
66 variable_write(
"ARCH_TYPE", ARCH_TYPE);
67 variable_write(
"VERNAME", VERNAME);
68 variable_write(
"SUBVERSIONNAME", SUBVERSIONNAME);
69 variable_write(
"VERSION", VERSION_STRING);
72 char* f =
"R:\\autoexec.bat";
76 tty_printf(
"[AutoExec] Не удалось найти файл `%s`.\n",f);
82 uint8_t* buffer = kcalloc(1,
filesize + 1);
86 qemu_log(
"'%s'", buffer);
88 BAT_T* token = bat_parse_string(buffer);
91 int ret = bat_runtime_exec(token);
92 qemu_warn(
"RETURN CODE: %d\n",ret);
101 void __createRamDisk(){
102 qemu_note(
"[INITRD] Create virtual read-write disk...");
105 qemu_err(
"[INITRD] Fatal create virtual disk");
108 qemu_log(
"[INITRD] Temp disk is (%d bytes) created to %x", ramdisk_size,
disk_t);
109 dpm_reg(
'T',
"TempDisk",
"TEMPFS", 2, ramdisk_size, 0, 0, 2,
"TEMP-DISK",
disk_t);
110 fs_tempfs_format(
'T');
111 qemu_ok(
"[INITRD] The virtual hard disk has been successfully created.");
116 for(uint32_t i = y; i < y + h; i++) {
117 for(uint32_t j = x; j < x + w; j++) {
118 uint8_t* a = (framebuffer_addr + (j * ((mboot->framebuffer_bpp) >> 3)) + i * (mboot->framebuffer_pitch));
120 a[2] = (color >> 16) & 0xff;
121 a[1] = (color >> 8) & 0xff;
122 a[0] = (color) & 0xff;
127 #define draw_raw_fb(a, b, c, d, e, f)
137 qemu_log(
"Kernel command line at address %x and contains: '%s'", (
size_t)cmd, cmd);
143 uint32_t kCMDc_c = 0;
144 char* out[128] = {0};
146 for(
int i = 0; kCMDc >= i; i++){
148 char* out_data[128] = {0};
150 qemu_log(
"[kCMD] [%d] %s is ignore.",i,out[i]);
154 if (
strcmpn(out_data[0],
"bootscreen")){
156 if (
strcmpn(out_data[1],
"minimal")){
158 }
else if (
strcmpn(out_data[1],
"light")){
160 }
else if (
strcmpn(out_data[1],
"dark")) {
163 qemu_log(
"\t Sorry, no support bootscreen mode!");
167 if (
strcmpn(out_data[0],
"NatSuki-Login")){
168 __milla_setLogin(out_data[1]);
170 if (
strcmpn(out_data[0],
"NatSuki-Password")){
171 __milla_setPasswd(out_data[1]);
173 if (
strcmpn(out_data[0],
"ramdisk")){
174 ramdisk_size =
atoi(out_data[1]);
176 if (
strcmpn(out_data[0],
"disable")){
177 if (
strcmpn(out_data[1],
"coms")){
183 qemu_log(
"\t COM-OUT DISABLED");
184 }
else if (
strcmpn(out_data[1],
"floppy")){
186 qemu_log(
"\t FLOPPY DISABLED");
187 }
else if (
strcmpn(out_data[1],
"network")){
188 test_network =
false;
189 qemu_log(
"\t NETWORK DISABLED");
190 }
else if (
strcmpn(out_data[1],
"pc-speaker")){
192 qemu_log(
"\t PC-Speaker DISABLED");
193 }
else if (
strcmpn(out_data[1],
"rdsp")){
195 qemu_log(
"\t RDSP DISABLED");
197 qemu_log(
"\t Sorry, no support!");
216 qemu_log(
"[InitRD] [SEFS] Initialization of the virtual disk. The SEFS virtual file system is used.");
217 qemu_log(
"[InitRD] [SEFS] The virtual disk space is located at address %x.", irdst);
218 qemu_log(
"[InitRD] [SEFS] The virtual disk space is ends at %x.", irded);
229 extern size_t CODE_end;
230 extern size_t DATA_start;
231 extern size_t DATA_end;
232 extern size_t RODATA_start;
233 extern size_t RODATA_end;
234 extern size_t BSS_start;
235 extern size_t BSS_end;
245 __com_init(PORT_COM1);
247 __asm__
volatile(
"movl %%esp, %0" :
"=r"(init_esp));
249 framebuffer_addr = (uint8_t *) (mboot->framebuffer_addr);
251 draw_raw_fb(mboot, 0, 0, 200, 16, 0x444444);
255 qemu_log(
"SayoriOS v%d.%d.%d\nBuilt: %s",
256 VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH,
260 qemu_log(
"Bootloader header at: %x", (
size_t)mboot);
262 qemu_log(
"SSE: %s", sse_check() ?
"Supported" :
"Not supported");
268 qemu_log(
"Setting `Interrupt Descriptor Table`...");
269 init_descriptor_tables();
270 qemu_log(
"Setting `RIH`...");
273 qemu_log(
"Initializing FPU...");
276 draw_raw_fb(mboot, 0, 0, 400, 16, 0x888888);
280 __asm__
volatile(
"sti");
282 draw_raw_fb(mboot, 0, 0, 800, 16, 0xffffff);
284 qemu_log(
"Checking RAM...");
286 qemu_log(
"Memory summary:");
287 qemu_log(
" Code: %x - %x", (
size_t)&
CODE_start, (
size_t)&CODE_end);
288 qemu_log(
" Data: %x - %x", (
size_t)&DATA_start, (
size_t)&DATA_end);
289 qemu_log(
" Read-only data: %x - %x", (
size_t)&RODATA_start, (
size_t)&RODATA_end);
290 qemu_log(
" BSS: %x - %x", (
size_t)&BSS_start, (
size_t)&BSS_end);
291 qemu_log(
"Memory manager initialization...");
293 grub_modules_prescan(mboot);
297 mark_reserved_memory_as_used((
memory_map_entry_t *) mboot->mmap_addr, mboot->mmap_length);
304 switch_qemu_logging();
310 qemu_log(
"Registration of file system drivers...");
311 fsm_reg(
"TARFS", 1, &fs_tarfs_read, &fs_tarfs_write, &fs_tarfs_info, &fs_tarfs_create, &fs_tarfs_delete,
312 &fs_tarfs_dir, &fs_tarfs_label, &fs_tarfs_detect);
313 fsm_reg(
"FAT32", 1, &fs_fat32_read, &fs_fat32_write, &fs_fat32_info, &fs_fat32_create, &fs_fat32_delete,
314 &fs_fat32_dir, &fs_fat32_label, &fs_fat32_detect);
315 fsm_reg(
"NatFS", 1, &fs_natfs_read, &fs_natfs_write, &fs_natfs_info, &fs_natfs_create, &fs_natfs_delete,
316 &fs_natfs_dir, &fs_natfs_label, &fs_natfs_detect);
317 fsm_reg(
"ISO9660", 1, &fs_iso9660_read, &fs_iso9660_write, &fs_iso9660_info, &fs_iso9660_create, &fs_iso9660_delete,
318 &fs_iso9660_dir, &fs_iso9660_label, &fs_iso9660_detect);
319 fsm_reg(
"TEMPFS", 1, &fs_tempfs_read, &fs_tempfs_write, &fs_tempfs_info, &fs_tempfs_create, &fs_tempfs_delete,
320 &fs_tempfs_dir, &fs_tempfs_label, &fs_tempfs_detect);
323 grub_modules_init(mboot);
328 text_init(
"R:\\Sayori\\Fonts\\UniCyrX-ibm-8x16.psf");
331 qemu_log(
"Initializing the virtual video memory manager...");
334 qemu_log(
"Initializing Task Manager...");
339 qemu_log(
"Initalizing fonts...");
342 draw_vga_str(
"Initializing devices...", 23, 0, 0, 0xffffff);
353 if(ps2_channel2_okay) {
359 ps2_keyboard_install_irq();
360 ps2_mouse_install_irq();
363 pci_scan_everything();
373 file_descriptors_init();
377 asprintf(&btitle,
"Создание виртуального диска (%u kb.)...", ramdisk_size/1024);
384 qemu_log(
"Registering System Calls...");
388 qemu_log(
"Registering ENV...");
398 netcards_list_init();
407 dhcp_init_all_cards();
412 tty_printf(
"SayoriOS v%d.%d.%d\nДата компиляции: %s\n",
413 VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH,
416 tty_printf(
"\nВлюбиться можно в красоту, но полюбить - лишь только душу.\n(c) Уильям Шекспир\n");
418 if (__milla_getCode() != 0) {
419 tty_error(
"[ОШИБКА] [NatSuki] Не удалось выполнить инициализацию. Код ошибки: %d", __milla_getCode());
423 tty_printf(
"\nВремя: %d:%d:%d\n", time.hours, time.minutes, time.seconds);
425 _tty_printf(
"Listing ATA disks:\n");
432 qemu_log(
"RSDP at: %x", rsdp);
435 acpi_scan_all_tables(rsdp->RSDTaddress);
437 find_facp(rsdp->RSDTaddress);
441 tty_printf(
"ACPI not supported! (Are you running in UEFI mode?)\n");
442 qemu_err(
"ACPI not supported! (Are you running in UEFI mode?)");
446 tty_printf(
"Processors: %d\n", system_processors_found);
453 _tty_printf(
"Listing network cards:\n");
455 uint8_t mac_buffer[6] = {0};
457 for (
int i = 0; i < netcards_get_count(); i++) {
460 _tty_printf(
"\tName: %s\n", entry->name);
461 entry->get_mac_addr(mac_buffer);
463 _tty_printf(
"\tMAC address: %v:%v:%v:%v:%v:%v\n",
523 qemu_log(
"System initialized everything at: %f seconds.", (
double) (
getTicks() - kernel_start_time) /
getFrequency());
void bootScreenPaint(char *title)
Обновить информацию для BootScreen.
void bootScreenInit(uint32_t count)
Инициализирует BootScreen.
void bootScreenChangeTheme(uint32_t th)
Сменить тему BootScreen.
void bootScreenClose(uint32_t bg, uint32_t tx)
Завершает работу BootScreen.
void bootScreenChangeMode(int m)
Смена режима отображения BootScreen.
void bootScreenLazy(bool l)
Включить ленивую загрузку для BootScreen.
sayori_time_t get_time()
Считывает время и передает в удобной структуре
int detect_cpu(bool silent)
Получение имени процессора (Инициализация)
int dpm_reg(char Letter, char *Name, char *FS, int Status, size_t Size, size_t Sectors, size_t SectorSize, int AddrMode, char *Serial, void *Point)
[DPM] Регистрация дискового раздела
void fpu_init()
Инициализация FPU.
void initrd_sefs(size_t irdst, size_t irded)
Монтирует виртуальный диск с файловой системой Sayori Easy File System.
void kHandlerCMD(char *)
Обработка команд указаных ядру при загрузке
void __attribute__((noreturn))
#define INITRD_RW_SIZE
Размер виртуального диска 1.44mb floppy.
size_t CODE_start
Точка входа в ядро
void keyboardInit()
Выполняет инициализацию клавиатуры
size_t filesize(const char *Path)
[FileIO] Возвращает размер указанного файла
size_t strlen(const char *str)
Возращает длину строки
uint32_t atoi(const char s[])
Превращает строку в число
bool strcmpn(const char *str1, const char *str2)
Сравнение строк
void mouse_install()
Установщик драйвера мыши
bool text_init(char *psf)
Инициализация шрифта PSF.
void init_task_manager(void)
Инициализация менеджера задач
uint32_t str_cdsp(const char *a_str, const char *del)
Функция отладки
void str_split(const char a_str[], char *out[], char *del)
Функция для деления строк
void fclose(FILE *stream)
Закончить работу с файлом
FILE * fopen(const char *filename, const char *_mode)
Открывает файл
int fsize(FILE *stream)
Получение размера файла в байтах
int fread(FILE *stream, size_t count, size_t size, void *buffer)
Чтение файла
Структура файла. Требуется для работы с VFS.
size_t getFrequency()
Получить частоту таймера
size_t getTicks()
Получить количество тиков
void init_timer(uint32_t f)
Инициализация модуля системного таймера
void init_syscalls(void)
Инициализация системных вызовов
void triggersConfig()
Инициализация триггеров
void tty_taskInit()
Инициализация потоков
void tty_fontConfigurate()
Инициализация системы для печати через шрифты
void tty_set_bgcolor(uint32_t color)
Изменение цвета заднего фона
void tty_setcolor(uint32_t color)
Изменение цвета текста
void drv_vbe_init(multiboot_header_t *mboot)