diff --git a/.gitignore b/.gitignore index 727feee..f87c2b5 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ bochsrc.bxrc *.mod webring.json webring.txt +kernel/const.inc diff --git a/kernel/Makefile b/kernel/Makefile index eaf4ce7..73df900 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -17,6 +17,10 @@ SRCS = kernel.asm \ .PHONY: all all: $(KERNEL) +PHONY: const.inc +const.inc: const.inc.in + sh $(TOOLSDIR)/version.sh $< $@ + $(KERNEL): $(SRCS) $(AS) kernel.asm $@ diff --git a/kernel/const.inc b/kernel/const.inc.in similarity index 62% rename from kernel/const.inc rename to kernel/const.inc.in index 299beb3..8aa4da9 100644 --- a/kernel/const.inc +++ b/kernel/const.inc.in @@ -7,9 +7,11 @@ PSIZE = 0x1000 STPDBOOT_MAGIC = 0x53545044 ; --------- VERSION ------------- -VERSION_MAJOR = 1 -VERSION_MINOR = 0 -VERSION_COMMIT = "@COMMIT@" +VERSION_MAJOR = @MAJOR@ +VERSION_MINOR = @MINOR@ +VERSION_COMMIT equ "@COMMIT@" +VERSION_FULL equ "@FULLVERSION@" +BUILD_DATE equ "@DATE@" ; ------------- OTHER ----------- CR = 0x0D diff --git a/kernel/dev/vga_console.inc b/kernel/dev/vga_console.inc index bba8992..dd12861 100644 --- a/kernel/dev/vga_console.inc +++ b/kernel/dev/vga_console.inc @@ -16,7 +16,10 @@ vga_console_clear: rep stosb ret + ;; Function: vga_console_putc + ;; + ;; In: + ;; AL - charactere to print vga_console_putc: - - ret + ret diff --git a/kernel/irq.inc b/kernel/irq.inc index 03c007e..e69de29 100644 --- a/kernel/irq.inc +++ b/kernel/irq.inc @@ -1,3 +0,0 @@ -irq_timer: - iret - diff --git a/kernel/isr.inc b/kernel/isr.inc index ddf3f08..1f1c785 100644 --- a/kernel/isr.inc +++ b/kernel/isr.inc @@ -1,9 +1,15 @@ + ;; File: isr.inc macro ISR [name,error] { forward dd isr_#name +forward + local szIntName + szIntName db `name#, 0 forward isr_#name#: cli + mov esi, szIntName + call klog if error eq 0 push 0 end if @@ -25,6 +31,17 @@ idt_setup: inc ecx cmp ecx, 32 jb @b +@@: + mov eax, irq_dummy + mov [aInterruptGate + (ecx * 8)], ax + mov [aInterruptGate + (ecx * 8) + 2], word 0x08 + + mov [aInterruptGate + (ecx * 8) + 5], word 0x8E + shr eax, 16 + mov [aInterruptGate + (ecx * 8) + 6], ax + inc ecx + cmp ecx, 0x30 + jb @b mov ecx, 0x42 mov eax, isr_syscall @@ -49,6 +66,9 @@ aInterruptGate: .end: +irq_dummy: + iret + isr_common: pusha @@ -61,6 +81,9 @@ isr_common: mov fs, ax mov gs, ax + mov eax, [esp+IntFrame.intno] + push eax + mov esi, szMsgInterrupt call klog @@ -110,4 +133,4 @@ ISR \ security_exception, 0, \ reserved31, 0 -szMsgInterrupt db "Interrupt", 0 +szMsgInterrupt db "Interrupt (int: %x)", 0 diff --git a/kernel/kernel.asm b/kernel/kernel.asm index 30b08e4..c487854 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -63,7 +63,7 @@ kmain: call idt_setup - int 0x42 + ;int 0x42 .halt: hlt @@ -84,7 +84,7 @@ kmain: include 'pic.inc' -szMsgKernelAlive db "Kernel is alive", 0 +szMsgKernelAlive db "Kernel (", VERSION_FULL , ") is alive", 0 szErrorBootProtocol db "Error: wrong magic number", 0 boot_structure BootInfo diff --git a/kernel/pic.inc b/kernel/pic.inc index fcaae5d..8998321 100644 --- a/kernel/pic.inc +++ b/kernel/pic.inc @@ -50,6 +50,20 @@ pic_init: ret + ;; Function: pic_eoi + ;; + ;; In: + ;; EAX - irq +pic_eoi: + cmp eax, 8 + jb @f + mov al, PIC_EOI + out PIC2_COMMAND, al +@@: + mov al, PIC_EOI + out PIC1_COMMAND, al + ret + pic_disable: mov al, 0xFF out PIC1_DATA, al diff --git a/kernel/sys/cpu.inc b/kernel/sys/cpu.inc index e11de06..922bbf2 100644 --- a/kernel/sys/cpu.inc +++ b/kernel/sys/cpu.inc @@ -133,7 +133,7 @@ struc IDTGate { ;; > +--------------- |----------------+-----------------|-----------------+ -struc intframe { +struc IntFrame { ;; registers .edi dd ? .esi dd ? @@ -161,3 +161,7 @@ struc intframe { .useresp dd ? .ss dd ? } +virtual at 0 + IntFrame IntFrame + sizeof.IntFrame: +end virtual diff --git a/kernel/syscall.inc b/kernel/syscall.inc index d4ad6a0..c21550b 100644 --- a/kernel/syscall.inc +++ b/kernel/syscall.inc @@ -1,5 +1,7 @@ -SYSCALL_EXIT = 0x01 -SYSCALL_FORK = 0x02 +SYSCALL_EXIT = 0x01 +SYSCALL_FORK = 0x02 +SYSCALL_READ = 0x03 +SYSCALL_WRITE = 0x04 isr_syscall: push eax diff --git a/tools/fat.c b/tools/fat.c index 6ed9961..9f6eb61 100644 --- a/tools/fat.c +++ b/tools/fat.c @@ -1,226 +1,226 @@ -#include -#include -#include -#include -#include -#include -#include - -typedef struct -{ - uint8_t jmp[3]; - uint8_t OEM[8]; - uint16_t bytes_per_sector; - uint8_t sectors_per_cluster; - uint16_t reserved_sectors; - uint8_t number_of_FATs; - uint16_t root_entries; - uint16_t logical_sectors; - uint8_t media_descriptor; - uint16_t sectors_per_FAT; - uint16_t sectors_per_track; - uint16_t heads_per_cylinder; - uint32_t hidden_sectors; - uint32_t total_sectors; - - /* EBPB */ - uint8_t drive_number; - uint8_t flags; - uint8_t signature; - uint32_t serial; - uint8_t label[11]; - uint8_t fs_type[8]; -} __attribute__((packed)) BiosParamBlock; - -typedef struct -{ - uint8_t name[8]; - uint8_t ext[3]; - uint8_t attr; - uint16_t reserved0; - uint16_t creation_time; - uint16_t creation_date; - uint16_t access_date; - uint16_t reserved1; - uint16_t mod_time; - uint16_t mod_date; - uint16_t start; - uint32_t size; -} __attribute__((packed)) Entry; - -static const char *prg_name; -static int sector_size = 512; - -static void -fatal(const char *str, ...) -{ - va_list ap; - - fprintf(stderr, "%s: ", prg_name); - va_start(ap, str); - vfprintf(stderr, str, ap); - va_end(ap); - fprintf(stderr, "\n"); - - exit(EXIT_FAILURE); -} - -static void -read_sector(uint8_t *dest, int sect, FILE *fp) -{ - if (fseek(fp, sect*sector_size, SEEK_SET) != 0) goto fatal_sect; - if (fread(dest, 1, sector_size, fp) != sector_size) goto fatal_sect; - - return; - - fatal_sect: - fatal("Can't read sector %d", sect); -} - -static void -dump_bpb(BiosParamBlock *bpb) -{ - char label[12]; - - printf("Bytes per logical sector: %hd\n", bpb->bytes_per_sector); - sector_size = bpb->bytes_per_sector; - printf("Logical sectors per cluster: %d\n", bpb->sectors_per_cluster); - printf("Reserved logical sectors: %hd\n", bpb->reserved_sectors); - printf("Number of FATs: %d\n", bpb->number_of_FATs); - printf("Root directory entries: %hd\n", bpb->root_entries); - printf("Total logical sectors: %hd\n", bpb->logical_sectors); - printf("Logical sectors per FAT: %hd\n", bpb->sectors_per_FAT); - printf("Serial: %X\n", bpb->serial); - memset(label, 0, 12); - strncpy(label, bpb->label, 11); - printf("Label: '%s'\n", label); - printf("signature: %X\n", bpb->signature); -} - -static void -dump_entry(Entry *entry) -{ - char filename[9]; - char ext[4]; - int i; - - if (entry->name[0] == 0x0) return; - - memset(filename, 0, 9); - strncpy(filename, entry->name, 8); - memset(ext, 0, 4); - strncpy(ext, entry->ext, 3); - for (i = 7; i > 0; i--) - { - if (filename[i] == ' ') - { - filename[i] = '\0'; - } - else - { - break; - } - } - - printf("%s.%s\n", filename, ext); -} - -static void -dump(const char *img) -{ - FILE *fp; - BiosParamBlock *bpb; - uint8_t buffer[512]; - int root_start; - int root_size; - int i; - int j; - - fp = fopen(img, "rb"); - if (fp == NULL) fatal("Can't open '%s': %s", img, strerror(errno)); - - read_sector(buffer, 0, fp); - if (buffer[511] != 0xAA || buffer[510] != 0x55) - { - fatal("MBR not found"); - } - - bpb = (BiosParamBlock *)buffer; - - dump_bpb(bpb); - - root_start = bpb->sectors_per_FAT * bpb->number_of_FATs; - root_start += bpb->reserved_sectors; - - root_size = bpb->root_entries / (sector_size >> 0x5); - - for (i = 0; i < root_size; i++) - { - read_sector(buffer, root_start + i, fp); - for (j = 0; j < sector_size; j+=32) - { - dump_entry((Entry *)(buffer + j)); - } - } - - fclose(fp); - exit(EXIT_SUCCESS); -} - -static void -usage(int retcode) -{ - if (retcode == EXIT_FAILURE) - { - fprintf(stderr, "Try '%s -h' form more information.\n", prg_name); - } - else - { - printf("Usage: %s [-hV] [-D IMG] [-b BIN]\n", prg_name); - printf("\t-h\tdisplay this help and exit\n"); - printf("\t-V\toutput version information\n"); - printf("\t-D IMG\tdump fs information from IMG\n"); - - printf("\nReport bugs to <%s>\n", MK_BUGREPORT); - } - exit(retcode); -} - -static void -version(void) -{ - printf("%s commit %s\n", prg_name, MK_COMMIT); - exit(EXIT_SUCCESS); -} - -int -main(int argc, char **argv) -{ - prg_name = argv[0]; - - while ((argc > 1) && (argv[1][0] == '-')) - { - switch (argv[1][1]) - { - case 'h': - usage(EXIT_SUCCESS); - break; - case 'V': - version(); - break; - case 'D': - argv++; - argc--; - if (argc <= 1) usage(EXIT_FAILURE); - dump(argv[1]); - break; - default: - usage(EXIT_FAILURE); - break; - } - - argv++; - argc--; - } - return (EXIT_SUCCESS); -} +#include +#include +#include +#include +#include +#include +#include + +typedef struct +{ + uint8_t jmp[3]; + uint8_t OEM[8]; + uint16_t bytes_per_sector; + uint8_t sectors_per_cluster; + uint16_t reserved_sectors; + uint8_t number_of_FATs; + uint16_t root_entries; + uint16_t logical_sectors; + uint8_t media_descriptor; + uint16_t sectors_per_FAT; + uint16_t sectors_per_track; + uint16_t heads_per_cylinder; + uint32_t hidden_sectors; + uint32_t total_sectors; + + /* EBPB */ + uint8_t drive_number; + uint8_t flags; + uint8_t signature; + uint32_t serial; + uint8_t label[11]; + uint8_t fs_type[8]; +} __attribute__((packed)) BiosParamBlock; + +typedef struct +{ + uint8_t name[8]; + uint8_t ext[3]; + uint8_t attr; + uint16_t reserved0; + uint16_t creation_time; + uint16_t creation_date; + uint16_t access_date; + uint16_t reserved1; + uint16_t mod_time; + uint16_t mod_date; + uint16_t start; + uint32_t size; +} __attribute__((packed)) Entry; + +static const char *prg_name; +static int sector_size = 512; + +static void +fatal(const char *str, ...) +{ + va_list ap; + + fprintf(stderr, "%s: ", prg_name); + va_start(ap, str); + vfprintf(stderr, str, ap); + va_end(ap); + fprintf(stderr, "\n"); + + exit(EXIT_FAILURE); +} + +static void +read_sector(uint8_t *dest, int sect, FILE *fp) +{ + if (fseek(fp, sect*sector_size, SEEK_SET) != 0) goto fatal_sect; + if (fread(dest, 1, sector_size, fp) != sector_size) goto fatal_sect; + + return; + + fatal_sect: + fatal("Can't read sector %d", sect); +} + +static void +dump_bpb(BiosParamBlock *bpb) +{ + char label[12]; + + printf("Bytes per logical sector: %hd\n", bpb->bytes_per_sector); + sector_size = bpb->bytes_per_sector; + printf("Logical sectors per cluster: %d\n", bpb->sectors_per_cluster); + printf("Reserved logical sectors: %hd\n", bpb->reserved_sectors); + printf("Number of FATs: %d\n", bpb->number_of_FATs); + printf("Root directory entries: %hd\n", bpb->root_entries); + printf("Total logical sectors: %hd\n", bpb->logical_sectors); + printf("Logical sectors per FAT: %hd\n", bpb->sectors_per_FAT); + printf("Serial: %X\n", bpb->serial); + memset(label, 0, 12); + strncpy(label, bpb->label, 11); + printf("Label: '%s'\n", label); + printf("signature: %X\n", bpb->signature); +} + +static void +dump_entry(Entry *entry) +{ + char filename[9]; + char ext[4]; + int i; + + if (entry->name[0] == 0x0) return; + + memset(filename, 0, 9); + strncpy(filename, entry->name, 8); + memset(ext, 0, 4); + strncpy(ext, entry->ext, 3); + for (i = 7; i > 0; i--) + { + if (filename[i] == ' ') + { + filename[i] = '\0'; + } + else + { + break; + } + } + + printf("%s.%s\n", filename, ext); +} + +static void +dump(const char *img) +{ + FILE *fp; + BiosParamBlock *bpb; + uint8_t buffer[512]; + int root_start; + int root_size; + int i; + int j; + + fp = fopen(img, "rb"); + if (fp == NULL) fatal("Can't open '%s': %s", img, strerror(errno)); + + read_sector(buffer, 0, fp); + if (buffer[511] != 0xAA || buffer[510] != 0x55) + { + fatal("MBR not found"); + } + + bpb = (BiosParamBlock *)buffer; + + dump_bpb(bpb); + + root_start = bpb->sectors_per_FAT * bpb->number_of_FATs; + root_start += bpb->reserved_sectors; + + root_size = bpb->root_entries / (sector_size >> 0x5); + + for (i = 0; i < root_size; i++) + { + read_sector(buffer, root_start + i, fp); + for (j = 0; j < sector_size; j+=32) + { + dump_entry((Entry *)(buffer + j)); + } + } + + fclose(fp); + exit(EXIT_SUCCESS); +} + +static void +usage(int retcode) +{ + if (retcode == EXIT_FAILURE) + { + fprintf(stderr, "Try '%s -h' form more information.\n", prg_name); + } + else + { + printf("Usage: %s [-hV] [-D IMG] [-b BIN]\n", prg_name); + printf("\t-h\tdisplay this help and exit\n"); + printf("\t-V\toutput version information\n"); + printf("\t-D IMG\tdump fs information from IMG\n"); + + printf("\nReport bugs to <%s>\n", MK_BUGREPORT); + } + exit(retcode); +} + +static void +version(void) +{ + printf("%s commit %s\n", prg_name, MK_COMMIT); + exit(EXIT_SUCCESS); +} + +int +main(int argc, char **argv) +{ + prg_name = argv[0]; + + while ((argc > 1) && (argv[1][0] == '-')) + { + switch (argv[1][1]) + { + case 'h': + usage(EXIT_SUCCESS); + break; + case 'V': + version(); + break; + case 'D': + argv++; + argc--; + if (argc <= 1) usage(EXIT_FAILURE); + dump(argv[1]); + break; + default: + usage(EXIT_FAILURE); + break; + } + + argv++; + argc--; + } + return (EXIT_SUCCESS); +} diff --git a/tools/git-version b/tools/version.sh old mode 100755 new mode 100644 similarity index 50% rename from tools/git-version rename to tools/version.sh index d92e4f6..2b7c198 --- a/tools/git-version +++ b/tools/version.sh @@ -6,6 +6,9 @@ if [ ! -n "$vers" ]; then vers="0.0" fi +major="$(echo -n "${vers}" | cut -d. -f1)" +minor="$(echo -n "${vers}" | cut -d. -f1)" + commit="$(git rev-parse --short HEAD)" full_vers="${vers}-${commit}" @@ -13,4 +16,9 @@ if [ -n "$(git status)" ]; then full_vers="${full_vers}-dirty" fi -echo -n "${full_vers}" +sed -e "s/@MAJOR@/${major}/g" \ + -e "s/@MINOR@/${minor}/g" \ + -e "s/@COMMIT@/${commit}/g"\ + -e "s/@FULLVERSION@/${full_vers}/g" \ + -e "s/@DATE@/$(date)/g" \ + "$1" > "$2"