From 7a540ca1e191394cae58fa18c49ca7429d8f8e3c Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 16 Aug 2022 19:12:16 -0300 Subject: [PATCH] fix elf stack issues and interrupt gsbase stuff --- Makefile | 7 ++++++- initrd/sbin/init | Bin 8872 -> 1280 bytes src/arch/x86_64/isr.asm | 19 ++++++++++++++----- src/arch/x86_64/panic.c | 2 +- src/fs/tmpfs.c | 2 +- src/include/errno.h | 3 ++- src/include/sys/stat.h | 2 +- src/include/sys/types.h | 2 +- src/sys/sched/elf.c | 13 +++++++++++-- 9 files changed, 37 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index b8130359..cfde113d 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,12 @@ $(KERNEL): srcdir $(KERNELSRCDEPS) kernel.ld mkdir -p $(ISO) $(CC) $(LDFLAGS) -o $@ $(call rwildcard,bin,*.o) -$(INITRD): initrd +.phony: rebuildinitrd +rebuildinitrd: + rm $(INITRD) + cd initrd;tar -cf $(INITRD) * + +$(INITRD): $(shell find initrd) cd initrd;tar -cf $(INITRD) * sysdisk.iso: $(ISO) $(INITRD) diff --git a/initrd/sbin/init b/initrd/sbin/init index 1d26fa011208338d5e3b4d15196ee9623ea4b22f..c76ad65efcd6b6c8eefaa45014683ddbb31a8b6c 100755 GIT binary patch literal 1280 zcmb_c&ubGw6n?w*m&G4z?ZHx!6%pDVmPA3MibTTNIfw@_Ac8L2bYlzMRCgy(#b6*P zT|yzp`UiONqDN0ws2aR^5qj)J2s9T@mJ*Eb&CbL%5KnzD^S$@I@4cO!nce61%^SL= zfifMg0Y#<;25}jh$PUFoa|SM>CIcfdEVP4vQ{;&{g&VT9!fsa9>Z|kV>O_PGU}>!TSLheyY=k5SjHC^5cqYgPw943SA04?T*pD!BsQVFACk=~avue~L2gHqur*xf%iV z%&f3_=+suI6Si!2W1&}-p&GB@FZ;f0_Ke#6BYfX9|1h6(pgfO7aCz(u-|tA`q8B!x z(4EgaQ2OgkMy;1>yz~`1cPL@DqUr2a@^?x7|LEiO^{6m%P)qo0U0hqv`L6#}Vb#%M Iv9s&_A7K(e5C8xG diff --git a/src/arch/x86_64/isr.asm b/src/arch/x86_64/isr.asm index 0331839b..6c007a93 100644 --- a/src/arch/x86_64/isr.asm +++ b/src/arch/x86_64/isr.asm @@ -20,7 +20,15 @@ section .text push rbx push rax + + mov rax, ds + + cmp rax,0x43 + je .noswapgs + swapgs + .noswapgs: + push rax mov rax, es push rax @@ -28,12 +36,13 @@ section .text push rax mov rax, gs push rax + + ; now use kernel segments for data - cmp rax,0x43 - jmp .noswapgs - swapgs - .noswapgs: - + mov rax, 0x30 + mov ds, rax + mov es, rax + mov ss, rax mov rdi,cr2 push rdi diff --git a/src/arch/x86_64/panic.c b/src/arch/x86_64/panic.c index 01de8224..d961b4e8 100644 --- a/src/arch/x86_64/panic.c +++ b/src/arch/x86_64/panic.c @@ -34,7 +34,7 @@ __attribute((noreturn)) void _panic(char* reason, arch_regs *reg){ printf("Panic location: %p\n", reg->rip); - if(reg->rbp != 0){ + if(reg->rbp != 0 && reg->cs == 0x28){ printf("Stack trace:\n"); tracestack((uint64_t**)reg->rbp); } diff --git a/src/fs/tmpfs.c b/src/fs/tmpfs.c index 2ad58e42..aa360977 100644 --- a/src/fs/tmpfs.c +++ b/src/fs/tmpfs.c @@ -68,7 +68,7 @@ static int tmpfs_read(int *error, vnode_t* node, void* buff, size_t count, size_ } static int tmpfs_unmount(fs_t* fs) UNIMPLEMENTED -static int tmpfs_open(dirnode_t* parent, char* name) UNIMPLEMENTED +static int tmpfs_open(dirnode_t* parent, char* name){ return ENOENT;} // tmpfs open should never be called if a file exists static int tmpfs_close(vnode_t* node) UNIMPLEMENTED static int tmpfs_mkdir(dirnode_t* parent, char* name, mode_t mode){ diff --git a/src/include/errno.h b/src/include/errno.h index 71b07b63..57fd616c 100644 --- a/src/include/errno.h +++ b/src/include/errno.h @@ -8,6 +8,7 @@ #define ENOSYS 5 #define EEXIST 6 #define ENOENT 7 - +#define EACCES 8 +#define EAGAIN 9 #endif diff --git a/src/include/sys/stat.h b/src/include/sys/stat.h index 465f4b76..0335bfe3 100644 --- a/src/include/sys/stat.h +++ b/src/include/sys/stat.h @@ -24,7 +24,7 @@ typedef struct { gid_t st_gid; dev_t st_rdev; off_t st_size; - + blksize_t st_blksize; blkcnt_t st_blocks; } stat; diff --git a/src/include/sys/types.h b/src/include/sys/types.h index 2ce3202e..75bbe745 100644 --- a/src/include/sys/types.h +++ b/src/include/sys/types.h @@ -14,7 +14,7 @@ typedef id_t pid_t; typedef id_t uid_t; typedef id_t tid_t; typedef size_t ino_t; -typedef size_t mode_t; +typedef int mode_t; typedef int dev_t; typedef ssize_t off_t; typedef size_t nlink_t; diff --git a/src/sys/sched/elf.c b/src/sys/sched/elf.c index 7c4d0fc3..d3935f53 100644 --- a/src/sys/sched/elf.c +++ b/src/sys/sched/elf.c @@ -100,12 +100,17 @@ static void* stacksetup(char* interp, char** argv, char** env){ char** argstart = (void*)envstart - (argc + 1)*sizeof(char*); if(interp) --argstart; - size_t* argcptr = (void*)argstart - sizeof(size_t); + char*** envpptr = (void*)argstart - sizeof(char**); + char*** argvptr = (void*)envpptr - sizeof(char**); + size_t* argcptr = (void*)argvptr - sizeof(size_t); // XXX auxv // copy the data - + + *envpptr = envstart; + *argvptr = argstart; + if(interp){ strcpy(argdatastart, interp); *argstart++ = argdatastart; @@ -126,9 +131,13 @@ static void* stacksetup(char* interp, char** argv, char** env){ envdatastart += strlen(env[i]) + 1; } + *envstart = NULL; + if(interp) argc++; + *argcptr = argc; + return argcptr;