From 105b58a6847559ef2b8b3d622ce03bd3c98ae361 Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Sun, 25 Aug 2024 19:40:10 +0200 Subject: [PATCH] Some changes, syscalls use reg structs and have return values --- Makefile | 2 +- include/interrupt/syscalls.h | 153 +++++++++++++++++++++++++---------- include/memory/malloc.h | 2 +- kern.iso | Bin 1470464 -> 1470464 bytes makedisk.c | 5 +- src/{editor.c => edit.c} | 0 src/{editor.ld => edit.ld} | 0 src/kernel.c | 38 ++++----- 8 files changed, 133 insertions(+), 67 deletions(-) rename src/{editor.c => edit.c} (100%) rename src/{editor.ld => edit.ld} (100%) diff --git a/Makefile b/Makefile index 58970c0..390f4fc 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ LDFLAGS = -z notext -melf_i386 SRC = ./src BIN = ./bin -C_FILES = calc editor +C_FILES = calc edit FONTS = testfont term16n .PHONY: os clean run diff --git a/include/interrupt/syscalls.h b/include/interrupt/syscalls.h index 5623b5a..55cc67a 100644 --- a/include/interrupt/syscalls.h +++ b/include/interrupt/syscalls.h @@ -6,58 +6,80 @@ #include #include #include +#include +#include +#include +#include #include #include -#include +#include /* * XXX WARNING - Update MAX_SYSCALLS in the handler XXX */ -// Args: ebx - number of miliseconds -void sys_sleep() { - uint32_t* sleepTimerTicks = (uint32_t*)SLEEP_TIMER; - - __asm__ volatile ("movl %%ebx, %0" : "=r"(*sleepTimerTicks)); +typedef struct { + uint32_t esp; + uint32_t ebx; + uint32_t ecx; + uint32_t edx; + uint32_t esi; + uint32_t edi; + uint32_t ebp; + uint32_t ds; + uint32_t es; + uint32_t fs; + uint32_t gs; + uint32_t eax; +} __attribute__ ((packed)) sys_regs_t; +int sys_reserved(sys_regs_t) { + printf("\e[1N\e[6M Illegal use of Reserved() system call! \e[8M\e[8N\n"); + return -1; +} + +// Args: ebx - number of miliseconds +int sys_sleep(sys_regs_t regs) { + uint32_t* sleepTimerTicks = (uint32_t*)SLEEP_TIMER; + *sleepTimerTicks = regs.ebx; + while (*sleepTimerTicks > 0) { // Wait... __asm__ volatile ("sti;hlt;cli;"); } + + return 0; } // Args: ebx - int fd // ecx - void* buf // edx - uint32_t len // Rets: Number of bytes written -void sys_write() { - int32_t fd = 0; - void* buf = NULL; - uint32_t len = 0; - - __asm__ volatile ("nop" : "=b"(fd), "=c"(buf), "=d"(len)); +int sys_write(sys_regs_t regs) { + int32_t fd = regs.ebx; + void* buf = (void*)regs.ecx; + uint32_t len = regs.edx; // TODO: Open fd table? if (fd == 1) { // "stdout" - int32_t result = terminalWrite(buf, len); // Call a terminal print function - __asm__ volatile ("movl %0, %%eax" : : "r"(result)); - } else { // Not implemented - __asm__ volatile ("movl $-1, %eax"); + return terminalWrite(buf, len); // Call a terminal print function + } else { + return -1; } } // TODO: Use a Read() sycall and read from stdin // Args: ebx - char* buffer -void sys_read() { - char* s; - __asm__ volatile ("movl %%ebx, %0" : "=r"(s)); +int sys_read(sys_regs_t regs) { + char* s = (char*)regs.ebx; reads(s); + + return 0; } // Args: ebx - size_t count // Rets: Pointer to malloc-ed memory -void sys_malloc() { - uint32_t count = 0; - __asm__ volatile ("movl %%ebx, %0" : "=b"(count)); +int sys_malloc(sys_regs_t regs) { + uint32_t count = regs.ebx; // First Malloc() if (!mallocListHead) { @@ -67,41 +89,88 @@ void sys_malloc() { void* ptr = mallocNextNode(count); mallocMergeFree(); - // Return allocated address in eax - __asm__ volatile ("movl %0, %%eax" : : "r"(ptr)); + return (uint32_t)ptr; } // Args: ebx - void* ptr -void sys_free() { - void* ptr = NULL; - __asm__ volatile ("movl %%ebx, %0" : "=b"(ptr)); +int sys_free(sys_regs_t regs) { + void* ptr = (void*)regs.ebx; mallocFree(ptr); + return 0; } // Args: ebx - path, // ecx - oflag // Rets: Opened file descriptor -void sys_open() { - uint32_t fd = 0; - char* path = NULL; - uint32_t oflag = 0; +int sys_open(sys_regs_t regs) { + int fd = 0; + char* path = (char*)regs.ebx; + uint32_t oflag = regs.ecx; - __asm__ volatile ("nop" : "=b"(path), "=c"(oflag)); + extern FILE* openFileTable; + extern uint32_t openFiles; + // TODO: better file finding + inode_t* root = (inode_t*)impl_superblock->rootInodePtr; + loadFile(root, (void*)SCRATCH_BLOCK_LOC); + inode_t* inode = getInode(path, (dirEntry_t*)SCRATCH_BLOCK_LOC); + + // TODO: check if max open files have'nt been reached + fd = openFiles++; + FILE* fp = openFileTable + fd; + fp->_ptr = 0; + fp->_offset = 0; + fp->_size = inode->sizeBytes; + fp->_flag = oflag; + fp->_file = fd; + + /*fp->_ptr = (unsigned char*)nextAvailableVirtualAddress; + + // Read file from disk + uint32_t pageCount = BYTES2BLOCKS(inode->sizeBytes); + if (pageCount == 0) { pageCount++; } + + for (size_t i = 0; i < pageCount; i++) { + ptEntry_t page = 0; + uint32_t physAddr = (uint32_t)allocPage(&page); + + if (!mapPage((void*)physAddr, (void*)nextAvailableVirtualAddress)) { + fd = -1; // TODO errno + break; + } + + nextAvailableVirtualAddress += PAGE_SIZE; + } + + if (!loadFile(inode, fp->_ptr)) { + fd = -1; // TODO errno + }*/ - __asm__ volatile ("movl %0, %%eax" : : "a"(fd)); + return fd; } // Args: ebx - int fd // Rets: status -void sys_close() {} +int sys_close(sys_regs_t regs) { + int fd = regs.ebx; + + extern FILE* openFileTable; + extern uint32_t openFiles; + + FILE* fp = openFileTable + fd; + //free(fp->_ptr); + openFiles--; + + return 0; +} // TODO -void sys_seek() {} +int sys_seek(sys_regs_t regs) { return -1; } // System call table -void (*syscalls[MAX_SYSCALLS])(void) = { +int (*syscalls[MAX_SYSCALLS])(sys_regs_t) = { + [SYS_RESERVED] = sys_reserved, [SYS_SLEEP] = sys_sleep, [SYS_WRITE] = sys_write, [SYS_READ] = sys_read, @@ -127,7 +196,7 @@ void syscallHandler(intFrame_t* iframe) { "ja invalidSyscall\n" // Call the syscall - "push eax\n" // Push required values + "push eax\n" "push gs\n" "push fs\n" "push es\n" @@ -139,11 +208,13 @@ void syscallHandler(intFrame_t* iframe) { "push ecx\n" "push ebx\n" "push esp\n" // Push stack pointer again (for variables and such idk) + "call [syscalls + eax * 4]\n" // Call syscall from table. Syscall number should be in eax - "add esp, 4\n" - "pop ebx\n" // Pop pushed values + "add esp, 4\n" // Do not override ESP + "pop ebx\n" "pop ecx\n" - "pop edx\n" + "add esp, 4\n" // Do not override EDX, some syscalls use it + "pop esi\n" "pop edi\n" "pop ebp\n" @@ -159,7 +230,7 @@ void syscallHandler(intFrame_t* iframe) { "mov eax, -1\n" // Current error thing "iretd\n" - ".att_syntax" // Switch back to Att Syntax (Just in case) + ".att_syntax" // Switch back to AT&T Syntax (Just in case) ); } diff --git a/include/memory/malloc.h b/include/memory/malloc.h index 86f6556..84c19bb 100644 --- a/include/memory/malloc.h +++ b/include/memory/malloc.h @@ -1,10 +1,10 @@ #ifndef MEMORY_MALLOC_H #define MEMORY_MALLOC_H -#include #include #include #include +#include // Singly linked list! typedef struct mallocNode_s { diff --git a/kern.iso b/kern.iso index 45d6e289b5a4a45926c86d3ebfa3daba3c2e6537..23932b563785c7555e5bbf29bd903a82a41d47a2 100644 GIT binary patch delta 5519 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 - diskRead(root->extent[0].block * 8, root->extent[0].length * 8, (void*)SCRATCH_BLOCK_LOC); - dirEntry_t* dentry = (dirEntry_t*)SCRATCH_BLOCK_LOC; - - inode_t* inode = getInode(argv[0], dentry); - if (inode == NULL) { - printf("Command not found: %s\n", argv[0]); - continue; - } + char* fileName = argv[0]; + //FILE* fp = fopen(fileName, "rb"); + + //if (fp == NULL) { + printf("Command not found: %s\n", fileName); + // continue; + //} - printf("%d: %s %dB\n", inode->id, argv[0], inode->sizeBytes); } } @@ -344,23 +337,22 @@ void printPhysicalMemmap() { } void initOpenFileTable() { - maxOpenFiles = 256; - - openFileTable = malloc(sizeof(FILE) * maxOpenFiles); - memset(openFileTable, 0, sizeof(FILE) * maxOpenFiles); + openFileTable = malloc(sizeof(FILE) * MAX_OPEN_FILES); + if (openFileTable == NULL) { printf("\e[1MFailed to init file table! Malloc() error.\e[8M"); } + memset(openFileTable, 0, sizeof(FILE) * MAX_OPEN_FILES); // offset and ptr are unused in these stdin = openFileTable + 0; stdin->_file = 0; - stdin->_oflag = O_RDONLY; + stdin->_flag = O_RDONLY; stdout = openFileTable + 1; stdout->_file = 1; - stdout->_oflag = O_WRONLY | O_APPEND; + stdout->_flag = O_WRONLY | O_APPEND; stderr = openFileTable + 2; stderr->_file = 2; - stderr->_oflag = O_WRONLY | O_APPEND; + stderr->_flag = O_WRONLY | O_APPEND; openFiles = 3; }