207 lines
4.3 KiB
C
207 lines
4.3 KiB
C
#include "../include/isr.h"
|
|
#include "../include/screen.h"
|
|
#include "../include/stdio.h"
|
|
#include "../include/utils.h"
|
|
#include "../include/disk.h"
|
|
#include "../include/string.h"
|
|
#include "../include/pic.h"
|
|
#include "../include/pit.h"
|
|
#include "../include/paging.h"
|
|
#include "../include/fat.h"
|
|
#include "../include/task.h"
|
|
#include "../include/multiboot.h"
|
|
|
|
#include <stdint.h>
|
|
|
|
disk_ops_t ops =
|
|
{
|
|
.read = ata_read,
|
|
.write = ata_write,
|
|
};
|
|
|
|
static fat_t g_fat;
|
|
static const char* months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
|
|
|
static int cat(const char* path)
|
|
{
|
|
file_t file;
|
|
int err = fat_fopen(&file, path, "r");
|
|
if (err)
|
|
return err;
|
|
|
|
uint8_t buf[512];
|
|
for (;;)
|
|
{
|
|
int cnt = fat_fread(&file, buf, 512);
|
|
if (cnt < 0)
|
|
return cnt;
|
|
|
|
printf("%.*s\n", cnt, buf);
|
|
printf("%s\n", buf);
|
|
if (cnt < 512)
|
|
break;
|
|
}
|
|
|
|
return fat_fclose(&file);
|
|
}
|
|
|
|
static int ls(const char* path)
|
|
{
|
|
dir_t dir;
|
|
dir_info_t info;
|
|
|
|
int err = fat_opendir(&dir, path);
|
|
if (err)
|
|
return err;
|
|
|
|
for (;;)
|
|
{
|
|
err = fat_readdir(&dir, &info);
|
|
if (err == FAT_ERR_EOF)
|
|
return FAT_ERR_NONE;
|
|
if (err)
|
|
return err;
|
|
|
|
printf("%X %s %x %x:%x %x %s%c\n",
|
|
info.size, months[info.modified.month], info.modified.day,
|
|
info.modified.hour, info.modified.min,
|
|
info.namelen, info.name, info.attr & FAT_ATTR_DIR ? '/' : ' ');
|
|
|
|
err = fat_nextdir(&dir);
|
|
if (err)
|
|
return err;
|
|
}
|
|
}
|
|
|
|
void test(int err, const char* huy)
|
|
{
|
|
if(err != 0)
|
|
printf("ERROR: %X %s\n", err, huy);
|
|
else
|
|
printf("%s done", huy);
|
|
}
|
|
|
|
void file_fuckery()
|
|
{
|
|
int err, cnt;
|
|
err = fat_mount(&ops, 0, &g_fat, "ebalo");
|
|
|
|
if(err)
|
|
printf("KATYAKATYAKATYAKATYAKATYA: %X\n", err);
|
|
|
|
printf("%X\n", err);
|
|
|
|
err = ls("/ebalo");
|
|
printf("\n\n\n");
|
|
err = fat_mkdir("/ebalo/numbers");
|
|
err = fat_mkdir("/ebalo/numbers/nigga");
|
|
printf("MKDIR ERR: %X\n", err);
|
|
|
|
err = fat_unlink("/ebalo/numbers/nigga/");
|
|
printf("UNLINK ERR: %X\n", err);
|
|
|
|
err = fat_unlink("/ebalo/numbers/");
|
|
printf("UNLINK ERR: %X\n", err);
|
|
|
|
/*err = fat_mkdir("/ebalo/numbers");
|
|
//err = cat("/ebalo/boot/grub/grub.cfg");
|
|
char *filenames[] = {"/ebalo/numbers/d","/ebalo/numbers/e"};
|
|
for(int i = 0; i < 2; i++){
|
|
printf(filenames[i]);
|
|
file_t file;
|
|
err = fat_fopen(&file, filenames[i], "w");
|
|
if (err)
|
|
{printf("1 err %X\n", err); goto unmount;}
|
|
|
|
for (int i = 0; i < 10; i++)
|
|
{
|
|
cnt = fat_fprintf(&file, "This is test number %d\n", i);
|
|
if (cnt < 0)
|
|
{printf("2 cnt: %X\n", cnt); goto unmount;}
|
|
}
|
|
|
|
err = fat_fclose(&file);
|
|
}
|
|
*/
|
|
unmount:
|
|
printf("err%X\n", err);
|
|
err = fat_umount(&g_fat);
|
|
test(err, "unmount");
|
|
}
|
|
|
|
void apply_pic_masks()
|
|
{
|
|
//0x21 is master pic, 0xa1 is slave pic
|
|
outb(0x21,0xfc);//0b11111100 (bit 0 is PIT, bit 1 is keyboard and so on)
|
|
outb(0xa1,0xff);
|
|
}
|
|
|
|
void kmain(unsigned int magic, unsigned int info)
|
|
{
|
|
struct multiboot_info mbi;
|
|
memcpy(&mbi, (void*)info, sizeof(struct multiboot_info));
|
|
|
|
terminal_initialize();
|
|
printf("KatauOS booting up\n");
|
|
|
|
if(mbi.flags & MULTIBOOT_INFO_BOOT_LOADER_NAME) {
|
|
printf("bootloader: %s\n", mbi.boot_loader_name);
|
|
}
|
|
|
|
|
|
isr_install();
|
|
pic_remap(0x20, 0x28);
|
|
pit_init(100);
|
|
|
|
apply_pic_masks();
|
|
|
|
paging_init();
|
|
printf("paging_init done\n");
|
|
test_paging();
|
|
init_allocator();
|
|
heap_init();
|
|
printf("after heap_init\n");
|
|
__asm__ __volatile__ ("sti");
|
|
//scheduler_init();
|
|
printf("Kernel init sequence completed\n");
|
|
|
|
char yooo[256] = "heheh";
|
|
printf("test string: %s\n", yooo);
|
|
|
|
disk_info info1;
|
|
get_disk_info(&info1);
|
|
printf("CYL HEAD SECT: %X %X %X\n", info1.cylinders, info1.heads, info1.sectors);
|
|
|
|
//file_fuckery();
|
|
|
|
char *huy;
|
|
char *huy2;
|
|
char temp1[1024] = "rusya_krutoy";
|
|
char temp2[1024] = "katya_tozhe_krutaya";
|
|
|
|
huy = heap_alloc(1024);
|
|
huy2 = heap_alloc(1024);
|
|
|
|
memcpy(huy, temp1, sizeof(temp1));
|
|
memcpy(huy2, temp2, sizeof(temp1));
|
|
|
|
printf("huy1 address: 0x%X huy2 address:0x%X\n", &huy, &huy2);
|
|
printf("huy1 points to: 0x%X huy2 points to:0x%X\n", huy, huy2);
|
|
printf("huy1: %s\nhuy2: %s", huy, huy2);
|
|
|
|
while(1)
|
|
{
|
|
/* if(inportb(0x64) & 0x1)
|
|
{
|
|
unsigned char key = inportb(0x60);
|
|
if(key == 2)
|
|
terminal_writestring("1\n");
|
|
else if(key == 4)
|
|
terminal_writestring("3\n");
|
|
else
|
|
terminal_writestring("dunno what is it\n");
|
|
}
|
|
*/ }
|
|
|
|
}
|