diff --git a/Makefile b/Makefile index ef9fa28..804259f 100644 --- a/Makefile +++ b/Makefile @@ -10,11 +10,20 @@ INCDIR = /usr/include ASMDIR = /usr/asm AS = fasm +CC ?= gcc RM = rm -f MK_BUGREPORT := \"https://git.cute.engineering/d0p1/StupidOS/issues\" MK_COMMIT := \"$(shell git rev-parse --short HEAD)\" +ifneq (,$(findstring cl,$(CC))) +CFLAGS = /TC /D MK_COMMIT="$(MK_COMMIT)" /DMK_BUGREPORT="$(MK_BUGREPORT)" /INCLUDE:$(TOPDIR)include +LDFLAGS = /SUBSYSTEM:CONSOLE +else +CFLAGS = -DMK_COMMIT="$(MK_COMMIT)" -DMK_BUGREPORT="$(MK_BUGREPORT)" -I$(TOPDIR)include +LDFLAGS = +endif + SUBDIRS := external tools include boot kernel lib bin TARGET = stupid.tar.gz floppy1440.img floppy2880.img diff --git a/boot/bootsect/hdd.asm b/boot/bootsect/hdd.asm new file mode 100644 index 0000000..3045647 --- /dev/null +++ b/boot/bootsect/hdd.asm @@ -0,0 +1,49 @@ + ;; File: floppy.asm + format binary + use16 + + include '../common/const.inc' + include '../common/macro.inc' + +jmp short _start + +OEM_identifier db 'STUPID ' +bytes_per_sector dw 512 +sectors_per_cluster db 0 +reserved_sectors dw 0 +FAT_count db 0 +root_dir_entries dw 0 +total_sectors dw 0 +media_desc_type db 0 +sectors_per_FAT dw 0 +sectors_per_track dw 18 +heads_per_cylinder dw 2 +hidden_sectors dd 0 +large_sector_count dd 0 + ; Extended Boot Record +drive_number db 0 +reserved db 0 +signature db 0 +volume_id dd 0xB00B135 ; hope mine will grow :'( +volume_label db 'Stupid Boot' +system_id db ' ' + + +_start: + mov [drive_number], dl + + ; ensure int 13h extension + mov ah, 0x41 + mov bx, 0x55AA + int 0x13 + jc .error_lba + +.error_lba: + mov si, msg_error_13ext + jmp .error_print + + +msg_error_13ext db "We don't support CHS", CR, LF, 0 + + rb 0x7C00+512-2-$ + db 0x55, 0xAA diff --git a/boot/bootsect/mbr.asm b/boot/bootsect/mbr.asm index 8a91ebe..8a2aa16 100644 --- a/boot/bootsect/mbr.asm +++ b/boot/bootsect/mbr.asm @@ -20,6 +20,7 @@ mov di, MBR_BASE rep movsw jmp 0x0:start + start: ; set LBA mov ah, 0x41 diff --git a/boot/loader/loader.asm b/boot/loader/loader.asm index c679b93..2876ccd 100644 --- a/boot/loader/loader.asm +++ b/boot/loader/loader.asm @@ -36,6 +36,8 @@ _start: call a20_enable jc .error_a20 + xchg bx, bx + ; check drive type ; dl <= 0x7F == floppy ; dl >= 0x80 == hard drive @@ -55,10 +57,15 @@ _start: @@: ; detect filesystem (FAT12/16 or StpdFS) ; load kernel from filesystem + ; +---------+--------+---------+ + ; | bootsec | sect 1 | stpd sb | + ; +---------+--------+---------+ + ; for now fat12 is asumed + ; fetch memory map from bios - call memory_get_map - jc .error_memory + call memory_get_map + jc .error_memory ; video information call video_setup @@ -121,7 +128,8 @@ multiboot: ; get kernel from module common32: - mov dword [0xb8000], 0x07690748 + xchg bx, bx + mov dword [0xB8000], 0x07690748 ; paging ; identity map first 1MB diff --git a/boot/loader/logger.inc b/boot/loader/logger.inc index 9e194aa..202e2f8 100644 --- a/boot/loader/logger.inc +++ b/boot/loader/logger.inc @@ -29,7 +29,51 @@ bios_log_time: ret + ;; Function: bios_log_number + ;; + ;; Parameters: + ;; XX - number + ;; +bios_log_number: + push ebp + mov ebp, esp + sub esp, 10 + + leave + ret + + ;; Function: bios_log_hex + ;; bios_log_hex: + push bp + mov ebp, esp + sub esp, 12 + mov si, hex_prefix + call bios_print + + or edi, edi + jz .print_zero +.loop: + or edi, edi + jz .print_number + rol edi, 4 + mov eax, edi + and eax, 0xF + mov al, [hex_digits + eax] + mov [esp], al + inc esp + jmp .loop +.print_zero: + mov al, '0' + mov ah, 0x0E + int 0x10 + jmp .end +.print_number: + mov [esp], byte 0 + mov si, [ebp - 12] + call bios_print +.end: + leave ret ;; Function: bios_log @@ -43,12 +87,50 @@ bios_log: call bios_log_time pop si +.loop: + mov al, [si] + or al, al + jz .end + cmp al, '%' + jne .putchar + inc si + mov al, [si] + cmp al, '%' + je .putchar + cmp al, 's' + jne .check_x + mov di, si + pop ax + pop si + push ax call bios_print - - + mov si, di + jmp .next +.check_x: + cmp al, 'x' + jne .unknown_format + pop ax + pop edi + push ax + push si + call bios_log_hex + pop si + jmp .next +.unknown_format: + mov al, '?' +.putchar: + mov ah, 0x0E + int 0x10 +.next: + inc si + jmp .loop +.end: mov si, endline call bios_print + ret time db '[00:00.00] ', 0 +hex_prefix db '0x', 0 +hex_digits db '0123456789ABCDEF' endline db CR, LF, 0 diff --git a/kernel/const.inc b/kernel/const.inc index 9ac81b3..128a245 100644 --- a/kernel/const.inc +++ b/kernel/const.inc @@ -1,46 +1,48 @@ -KBASE = 0xC0000000 -PSIZE = 0x1000 - -; --------- VERSION ------------- -VERSION_MAJOR = 1 -VERSION_MINOR = 0 - -; --------- Registers ------------ -CR0_PE = 0x00000001 -CR0_MP = 0x00000002 -CR0_EM = 0x00000004 -CR0_TS = 0x00000008 -CR0_ET = 0x00000010 -CR0_NE = 0x00000020 -CR0_WP = 0x00010000 -CR0_AM = 0x00040000 -CR0_NW = 0x20000000 -CR0_CD = 0x40000000 -CR0_PG = 0x80000000 - -CR3_PWT = 0x08 -CR3_PCD = 0x10 - -CR4_VME = 0x0000001 -CR4_PVI = 0x0000002 -CR4_TSD = 0x0000004 -CR4_DE = 0x0000008 -CR4_PSE = 0x0000010 -CR4_PAE = 0x0000020 -CR4_MCE = 0x0000040 -CR4_PGE = 0x0000080 -CR4_PCE = 0x0000100 -CR4_OSDXSR = 0x0000200 -CR4_OSXMMEXCPT = 0x0000400 -CR4_UMIP = 0x0000800 -CR4_VMXE = 0x0002000 -CR4_SMXE = 0x0004000 -CR4_FSGSBASE = 0x0010000 -CR4_PCIDE = 0x0020000 -CR4_OSXSAVE = 0x0040000 -CR4_SMEP = 0x0100000 -CR4_SMAP = 0x0200000 -CR4_PKE = 0x0400000 -CR4_CET = 0x0800000 -CR4_PKS = 0x1000000 - +KBASE = 0xC0000000 +PSIZE = 0x1000 + +STPDBOOT_MAGIC = 0x53545044 + +; --------- VERSION ------------- +VERSION_MAJOR = 1 +VERSION_MINOR = 0 + +; --------- Registers ------------ +CR0_PE = 0x00000001 +CR0_MP = 0x00000002 +CR0_EM = 0x00000004 +CR0_TS = 0x00000008 +CR0_ET = 0x00000010 +CR0_NE = 0x00000020 +CR0_WP = 0x00010000 +CR0_AM = 0x00040000 +CR0_NW = 0x20000000 +CR0_CD = 0x40000000 +CR0_PG = 0x80000000 + +CR3_PWT = 0x08 +CR3_PCD = 0x10 + +CR4_VME = 0x0000001 +CR4_PVI = 0x0000002 +CR4_TSD = 0x0000004 +CR4_DE = 0x0000008 +CR4_PSE = 0x0000010 +CR4_PAE = 0x0000020 +CR4_MCE = 0x0000040 +CR4_PGE = 0x0000080 +CR4_PCE = 0x0000100 +CR4_OSDXSR = 0x0000200 +CR4_OSXMMEXCPT = 0x0000400 +CR4_UMIP = 0x0000800 +CR4_VMXE = 0x0002000 +CR4_SMXE = 0x0004000 +CR4_FSGSBASE = 0x0010000 +CR4_PCIDE = 0x0020000 +CR4_OSXSAVE = 0x0040000 +CR4_SMEP = 0x0100000 +CR4_SMAP = 0x0200000 +CR4_PKE = 0x0400000 +CR4_CET = 0x0800000 +CR4_PKS = 0x1000000 + diff --git a/kernel/intro.txt b/kernel/intro.txt new file mode 100644 index 0000000..460fee6 --- /dev/null +++ b/kernel/intro.txt @@ -0,0 +1,22 @@ +About: kernel memory map + +> +> Physical map +> +---------------+ +> | | +> +---------------+ +> | ISA hole ? | +> 0x00F00000 +---------------+ +> | RAM | +> +---------------+ +> | kernel | +> 0x00100000 +---------------+ +> | ROM | +> 0x000BFFFF +---------------+ +> | video display | +> | memory | +> 0x0009FFFF +---------------+ +> | RAM | +> | | +> 0x00000000 +---------------+ +> diff --git a/kernel/kernel.asm b/kernel/kernel.asm index e8e7311..86052bf 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -6,6 +6,7 @@ jmp kmain + include 'klog.inc' include 'mm/mm.inc' ;; Function: kmain @@ -17,7 +18,16 @@ ;; kmain: ; TODO: interupt, vmm - nop + cmp eax, STPDBOOT_MAGIC + jne .halt + + KLOG_INIT + + KLOG "kernel alive" + +.halt: + hlt + jmp $ _edata: diff --git a/kernel/klog.inc b/kernel/klog.inc new file mode 100644 index 0000000..2bb0393 --- /dev/null +++ b/kernel/klog.inc @@ -0,0 +1,5 @@ +macro KLOG_INIT { +} + +macro KLOG msg { +} diff --git a/kernel/mm/pmm.inc b/kernel/mm/pmm.inc new file mode 100644 index 0000000..e69de29 diff --git a/sbin/parted/main.c b/sbin/parted/main.c index 47355b0..2f23703 100644 --- a/sbin/parted/main.c +++ b/sbin/parted/main.c @@ -3,40 +3,19 @@ #include #include #include - -#define MBR_MAGIC0 0x55 -#define MBR_MAGIC1 0xAA - -#define MBR_PART_BOOTABLE (1 << 7) - -enum { - MBR_PART_TYPE_EMPTY = 0x00, - MBR_PART_TYPE_FAT12 = 0x01, - MBR_PART_TYPE_FAT16 = 0x04, - MBR_PART_TYPE_GPT_PROTECTIVE = 0xEE, - MBR_PART_TYPE_EFI = 0xEF -}; - -typedef struct partition { - uint8_t attributes; - uint8_t chs_start[3]; - uint8_t type; - uint8_t chs_last_sector[3]; - uint32_t lba_start; - uint32_t sectors_count; -} __attribute__((packed)) Partition; - -typedef struct mbr_header { - uint8_t raw[436]; - uint8_t uid[10]; - struct partition part[4]; - uint8_t magic[2]; -} __attribute__((packed)) MBRHeader; +#include +#include "mbr.h" static char *prg_name = NULL; static int dump_info = 0; static const char *diskpath = NULL; -static FILE *diskfd = NULL; +static FILE *diskfp = NULL; +static FILE *partfp[4] = { + NULL, + NULL, + NULL, + NULL +}; static MBRHeader header; static void @@ -88,8 +67,9 @@ usage(int retcode) printf("\t-h\tdisplay this help and exit\n"); printf("\t-V\toutput version information.\n"); printf("\t-d\tdump disk information\n"); + printf("\t-p0-3\t\n"); printf("\t-o out\twrite to file 'out'\n"); - printf("\t-e\textract parts\n"); + printf("\t-e\textract\n"); printf("\t-i img\t\n"); printf("\nReport bugs to <%s>\n", MK_BUGREPORT); } @@ -107,7 +87,8 @@ version(void) int main(int argc, char **argv) { - prg_name = argv[0]; + char c; + prg_name = basename(argv[0]); while ((argc > 1) && (argv[1][0] == '-')) { @@ -122,6 +103,23 @@ main(int argc, char **argv) case 'd': dump_info = 1; break; + case 'p': + c = argv[1][2] - '0'; + argv++; + argc--; + if (c != 0 && c != 1 && c != 2 && c != 3) + { + usage(EXIT_FAILURE); + } + partfp[c] = fopen(argv[2], "rb"); + if (partfp[c] == NULL) + { + fprintf(stderr, "%s: %s\n", diskpath, strerror(errno)); + return (EXIT_FAILURE); + } + break; + case 'e': + break; default: usage(EXIT_FAILURE); } @@ -133,14 +131,14 @@ main(int argc, char **argv) if (argc <= 1) usage(EXIT_FAILURE); diskpath = argv[1]; - diskfd = fopen(diskpath, "rb"); - if (diskfd == NULL) + diskfp = fopen(diskpath, "rb"); + if (diskfp == NULL) { fprintf(stderr, "%s: %s\n", diskpath, strerror(errno)); return (EXIT_FAILURE); } - if (fread(&header, sizeof(uint8_t), sizeof(MBRHeader), diskfd) != sizeof(MBRHeader)) + if (fread(&header, sizeof(uint8_t), sizeof(MBRHeader), diskfp) != sizeof(MBRHeader)) { fprintf(stderr, "%s: can't read mbr header\n", diskpath); return (EXIT_FAILURE); diff --git a/sbin/parted/mbr.h b/sbin/parted/mbr.h new file mode 100644 index 0000000..9122c13 --- /dev/null +++ b/sbin/parted/mbr.h @@ -0,0 +1,35 @@ +#ifndef PARTED_MBR_H +# define PARTED_MBR_H 1 + +# include + +# define MBR_MAGIC0 0x55 +# define MBR_MAGIC1 0xAA + +# define MBR_PART_BOOTABLE (1 << 7) + +enum { + MBR_PART_TYPE_EMPTY = 0x00, + MBR_PART_TYPE_FAT12 = 0x01, + MBR_PART_TYPE_FAT16 = 0x04, + MBR_PART_TYPE_GPT_PROTECTIVE = 0xEE, + MBR_PART_TYPE_EFI = 0xEF +}; + +typedef struct partition { + uint8_t attributes; + uint8_t chs_start[3]; + uint8_t type; + uint8_t chs_last_sector[3]; + uint32_t lba_start; + uint32_t sectors_count; +} __attribute__((packed)) Partition; + +typedef struct mbr_header { + uint8_t raw[436]; + uint8_t uid[10]; + struct partition part[4]; + uint8_t magic[2]; +} __attribute__((packed)) MBRHeader; + +#endif /* !PARTED_MBR_H */ diff --git a/tools/Makefile b/tools/Makefile index 986e2aa..456d8eb 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -1,11 +1,5 @@ -CC = gcc -RM = rm -f - TARGET = fat$(EXEXT) coff-ld$(EXEXT) parted$(EXEXT) mkfs.stpd$(EXEXT) -CFLAGS = -DMK_COMMIT="$(MK_COMMIT)" -DMK_BUGREPORT="$(MK_BUGREPORT)" -I../include -LDFLAGS = - .PHONY: all all: $(TARGET) @@ -16,7 +10,11 @@ coff-ld$(EXEXT): coff-ld.c $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) parted$(EXEXT): ../sbin/parted/main.c +ifneq (,$(findstring cl,$(CC))) + $(CC) /Fo:$@ $^ $(CFLAGS) $(LDFLAGS) +else $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) +endif mkfs.stpd$(EXEXT): ../sbin/mkfs.stpd/main.c $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)