From 260b14e505667fba591112e8405705bda79ba27c Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 25 Oct 2018 12:06:00 +0200 Subject: [PATCH] Implement errno in LibC. This also meant I had to implement BSS (SHT_NOBITS) sections in ELFLoader. I also added an strerror() so we can print out what the errors are. --- ELFLoader/ELFLoader.cpp | 16 +++++++++++ Kernel/Task.cpp | 28 ++++++++++++-------- Kernel/Task.h | 3 +-- Kernel/_fs_contents | Bin 1024000 -> 1024000 bytes Kernel/errno.h | 38 +++++++++++++++++++++++++++ Kernel/init.cpp | 6 +++-- LibC/entry.cpp | 4 +++ LibC/errno.h | 57 ++++++++++++++++++++++++++++++++++++++++ LibC/mman.cpp | 7 +++-- LibC/process.cpp | 4 ++- LibC/string.cpp | 46 ++++++++++++++++++++++++++++++++ LibC/string.h | 1 + LibC/unistd.cpp | 20 ++++++++------ Userland/sh.cpp | 6 ++++- 14 files changed, 209 insertions(+), 27 deletions(-) create mode 100644 Kernel/errno.h create mode 100644 LibC/errno.h diff --git a/ELFLoader/ELFLoader.cpp b/ELFLoader/ELFLoader.cpp index a14b3443f7..35e8020405 100644 --- a/ELFLoader/ELFLoader.cpp +++ b/ELFLoader/ELFLoader.cpp @@ -56,6 +56,22 @@ bool ELFLoader::layout() m_sections.set(section.name(), move(ptr)); return true; }); + m_image->forEachSectionOfType(SHT_NOBITS, [this, &failed] (const ELFImage::Section& section) { +#ifdef ELFLOADER_DEBUG + kprintf("[ELFLoader] Allocating nobits section: %s\n", section.name()); +#endif + if (!section.size()) + return true; + char* ptr = m_execSpace.allocateArea(section.name(), section.size()); + if (!ptr) { + kprintf("ELFLoader: failed to allocate section '%s'\n", section.name()); + failed = true; + return false; + } + memset(ptr, 0, section.size()); + m_sections.set(section.name(), move(ptr)); + return true; + }); return !failed; } diff --git a/Kernel/Task.cpp b/Kernel/Task.cpp index 4a534d479c..c8f5303133 100644 --- a/Kernel/Task.cpp +++ b/Kernel/Task.cpp @@ -9,6 +9,7 @@ #include #include #include "MemoryManager.h" +#include "errno.h" //#define DEBUG_IO //#define TASK_DEBUG @@ -166,25 +167,32 @@ int Task::sys$munmap(void* addr, size_t size) int Task::sys$spawn(const char* path) { - auto* child = Task::createUserTask(path, m_uid, m_gid, m_pid); + int error = 0; + auto* child = Task::createUserTask(path, m_uid, m_gid, m_pid, error); if (child) return child->pid(); - return -1; + return error; } -Task* Task::createUserTask(const String& path, uid_t uid, gid_t gid, pid_t parentPID) +Task* Task::createUserTask(const String& path, uid_t uid, gid_t gid, pid_t parentPID, int& error) { auto parts = path.split('/'); - if (parts.isEmpty()) + if (parts.isEmpty()) { + error = -ENOENT; return nullptr; + } auto handle = VirtualFileSystem::the().open(path); - if (!handle) + if (!handle) { + error = -ENOENT; // FIXME: Get a more detailed error from VFS. return nullptr; + } auto elfData = handle->readEntireFile(); - if (!elfData) + if (!elfData) { + error = -EIO; // FIXME: Get a more detailed error from VFS. return nullptr; + } InterruptDisabler disabler; // FIXME: Get rid of this, jesus christ. This "critical" section is HUGE. Task* t = new Task(parts.takeLast(), uid, gid, parentPID, Ring3); @@ -203,12 +211,14 @@ Task* Task::createUserTask(const String& path, uid_t uid, gid_t gid, pid_t paren if (!success) { delete t; kprintf("Failure loading ELF %s\n", path.characters()); + error = -ENOEXEC; return nullptr; } t->m_tss.eip = (dword)space.symbolPtr("_start"); if (!t->m_tss.eip) { delete t; + error = -ENOEXEC; return nullptr; } @@ -221,6 +231,7 @@ Task* Task::createUserTask(const String& path, uid_t uid, gid_t gid, pid_t paren kprintf("Task %u (%s) spawned @ %p\n", t->pid(), t->name().characters(), t->m_tss.eip); #endif + error = 0; return t; } @@ -758,11 +769,6 @@ Task* Task::kernelTask() return s_kernelTask; } -void Task::setError(int error) -{ - m_error = error; -} - Task::Region::Region(LinearAddress a, size_t s, RetainPtr&& z, String&& n) : linearAddress(a) , size(s) diff --git a/Kernel/Task.h b/Kernel/Task.h index 2a9e4532e0..f166df8c9b 100644 --- a/Kernel/Task.h +++ b/Kernel/Task.h @@ -16,7 +16,7 @@ class Task : public InlineLinkedListNode { friend class InlineLinkedListNode; public: static Task* createKernelTask(void (*entry)(), String&& name); - static Task* createUserTask(const String& path, uid_t, gid_t, pid_t parentPID); + static Task* createUserTask(const String& path, uid_t, gid_t, pid_t parentPID, int& error); ~Task(); static Vector allTasks(); @@ -100,7 +100,6 @@ public: int sys$getcwd(char*, size_t); static void initialize(); - void setError(int); static void taskDidCrash(Task*); diff --git a/Kernel/_fs_contents b/Kernel/_fs_contents index d3cf094bfb677388498aea3b48c881e5e7071095..182fabbb3f1c8812fbdba97dd26faf6846cd4807 100644 GIT binary patch literal 1024000 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�FsyA2fyl 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 zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3P$Xb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2A{7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z 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 z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!83@Fd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?3PwXTuWA4Q delta 20010 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 H26JHmHf!49 diff --git a/Kernel/errno.h b/Kernel/errno.h new file mode 100644 index 0000000000..e01e73798a --- /dev/null +++ b/Kernel/errno.h @@ -0,0 +1,38 @@ +#pragma once + +#define EPERM 1 // Operation not permitted +#define ENOENT 2 // No such file or directory +#define ESRCH 3 // No such process +#define EINTR 4 // Interrupted system call +#define EIO 5 // I/O error +#define ENXIO 6 // No such device or address +#define E2BIG 7 // Argument list too long +#define ENOEXEC 8 // Exec format error +#define EBADF 9 // Bad file number +#define ECHILD 10 // No child processes +#define EAGAIN 11 // Try again +#define ENOMEM 12 // Out of memory +#define EACCES 13 // Permission denied +#define EFAULT 14 // Bad address +#define ENOTBLK 15 // Block device required +#define EBUSY 16 // Device or resource busy +#define EEXIST 17 // File exists +#define EXDEV 18 // Cross-device link +#define ENODEV 19 // No such device +#define ENOTDIR 20 // Not a directory +#define EISDIR 21 // Is a directory +#define EINVAL 22 // Invalid argument +#define ENFILE 23 // File table overflow +#define EMFILE 24 // Too many open files +#define ENOTTY 25 // Not a typewriter +#define ETXTBSY 26 // Text file busy +#define EFBIG 27 // File too large +#define ENOSPC 28 // No space left on device +#define ESPIPE 29 // Illegal seek +#define EROFS 30 // Read-only file system +#define EMLINK 31 // Too many links +#define EPIPE 32 // Broken pipe +#define EDOM 33 // Math argument out of domain of func +#define ERANGE 34 // Math result not representable + +#define EOVERFLOW 75 // Value too large for defined data type diff --git a/Kernel/init.cpp b/Kernel/init.cpp index 0dca290075..31cf17ba3e 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -140,7 +140,8 @@ static void init_stage2() dword lastAlloc = sum_alloc; for (unsigned i = 0; i < 100; ++i) { - auto* shTask = Task::createUserTask("/bin/id", (uid_t)100, (gid_t)100, (pid_t)0); + int error; + auto* shTask = Task::createUserTask("/bin/id", (uid_t)100, (gid_t)100, (pid_t)0, error); kprintf("malloc stats: alloc:%u free:%u\n", sum_alloc, sum_free); kprintf("sizeof(Task):%u\n", sizeof(Task)); kprintf("delta:%u\n",sum_alloc - lastAlloc); @@ -149,7 +150,8 @@ static void init_stage2() } #endif - auto* shTask = Task::createUserTask("/bin/sh", (uid_t)100, (gid_t)100, (pid_t)0); + int error; + auto* shTask = Task::createUserTask("/bin/sh", (uid_t)100, (gid_t)100, (pid_t)0, error); banner(); diff --git a/LibC/entry.cpp b/LibC/entry.cpp index 9a34577977..2308bc453c 100644 --- a/LibC/entry.cpp +++ b/LibC/entry.cpp @@ -2,8 +2,12 @@ extern "C" int main(int, char**); +int errno; + extern "C" int _start() { + errno = 0; + // FIXME: Pass appropriate argc/argv. int status = main(0, nullptr); diff --git a/LibC/errno.h b/LibC/errno.h new file mode 100644 index 0000000000..5f4a403f5a --- /dev/null +++ b/LibC/errno.h @@ -0,0 +1,57 @@ +#pragma once + +#define EPERM 1 // Operation not permitted +#define ENOENT 2 // No such file or directory +#define ESRCH 3 // No such process +#define EINTR 4 // Interrupted system call +#define EIO 5 // I/O error +#define ENXIO 6 // No such device or address +#define E2BIG 7 // Argument list too long +#define ENOEXEC 8 // Exec format error +#define EBADF 9 // Bad file number +#define ECHILD 10 // No child processes +#define EAGAIN 11 // Try again +#define ENOMEM 12 // Out of memory +#define EACCES 13 // Permission denied +#define EFAULT 14 // Bad address +#define ENOTBLK 15 // Block device required +#define EBUSY 16 // Device or resource busy +#define EEXIST 17 // File exists +#define EXDEV 18 // Cross-device link +#define ENODEV 19 // No such device +#define ENOTDIR 20 // Not a directory +#define EISDIR 21 // Is a directory +#define EINVAL 22 // Invalid argument +#define ENFILE 23 // File table overflow +#define EMFILE 24 // Too many open files +#define ENOTTY 25 // Not a typewriter +#define ETXTBSY 26 // Text file busy +#define EFBIG 27 // File too large +#define ENOSPC 28 // No space left on device +#define ESPIPE 29 // Illegal seek +#define EROFS 30 // Read-only file system +#define EMLINK 31 // Too many links +#define EPIPE 32 // Broken pipe +#define EDOM 33 // Math argument out of domain of func +#define ERANGE 34 // Math result not representable + +#define EOVERFLOW 75 // Value too large for defined data type + + +#define __RETURN_WITH_ERRNO(rc, good_ret, bad_ret) \ + do { \ + if (rc < 0) { \ + errno = -rc; \ + return (bad_ret); \ + } else { \ + errno = 0; \ + return (good_ret); \ + } \ + } while(0) + +extern "C" { + +extern int errno; + +}; + diff --git a/LibC/mman.cpp b/LibC/mman.cpp index ad8aae334c..604f3aaf05 100644 --- a/LibC/mman.cpp +++ b/LibC/mman.cpp @@ -1,16 +1,19 @@ #include "mman.h" +#include "errno.h" #include extern "C" { void* mmap(void* addr, size_t size) { - return (void*)Syscall::invoke(Syscall::PosixMmap, (dword)addr, (dword)size); + int rc = Syscall::invoke(Syscall::PosixMmap, (dword)addr, (dword)size); + __RETURN_WITH_ERRNO(rc, (void*)rc, (void*)-1); } int munmap(void* addr, size_t size) { - return Syscall::invoke(Syscall::PosixMunmap, (dword)addr, (dword)size); + int rc = Syscall::invoke(Syscall::PosixMunmap, (dword)addr, (dword)size); + __RETURN_WITH_ERRNO(rc, rc, -1); } } diff --git a/LibC/process.cpp b/LibC/process.cpp index 045b3e3eeb..223b6871d7 100644 --- a/LibC/process.cpp +++ b/LibC/process.cpp @@ -1,11 +1,13 @@ #include "process.h" +#include "errno.h" #include extern "C" { int spawn(const char* path) { - return Syscall::invoke(Syscall::Spawn, (dword)path); + int rc = Syscall::invoke(Syscall::Spawn, (dword)path); + __RETURN_WITH_ERRNO(rc, rc, -1); } } diff --git a/LibC/string.cpp b/LibC/string.cpp index 252dc65657..94b4450249 100644 --- a/LibC/string.cpp +++ b/LibC/string.cpp @@ -1,4 +1,6 @@ #include "string.h" +#include "errno.h" +#include "stdio.h" extern "C" { @@ -10,5 +12,49 @@ size_t strlen(const char* str) return len; } +const char* strerror(int errnum) +{ + switch (errnum) { + case 0: return "No error"; + case EPERM: return "Operation not permitted"; + case ENOENT: return "No such file or directory"; + case ESRCH: return "No such process"; + case EINTR: return "Interrupted syscall"; + case EIO: return "I/O error"; + case ENXIO: return "No such device/address"; + case E2BIG: return "Argument list too long"; + case ENOEXEC: return "Exec format error"; + case EBADF: return "Bad fd number"; + case ECHILD: return "No child processes"; + case EAGAIN: return "Try again"; + case ENOMEM: return "Out of memory"; + case EACCES: return "Access denied"; + case EFAULT: return "Bad address"; + case ENOTBLK: return "Not a block device"; + case EBUSY: return "Resource busy"; + case EEXIST: return "File already exists"; + case EXDEV: return "Cross-device link"; + case ENODEV: return "No such device"; + case ENOTDIR: return "Not a directory"; + case EISDIR: return "Is a directory"; + case EINVAL: return "Invalid argument"; + case ENFILE: return "File table overflow"; + case EMFILE: return "Too many open files"; + case ENOTTY: return "Not a TTY"; + case ETXTBSY: return "Text file busy"; + case EFBIG: return "File too big"; + case ENOSPC: return "No space left"; + case ESPIPE: return "Illegal seek"; + case EROFS: return "File system is read-only"; + case EMLINK: return "Too many links"; + case EPIPE: return "Broken pipe"; + case EDOM: return "Math argument out of domain"; + case ERANGE: return "Math result not representable"; + case EOVERFLOW: return "Value too large for data type"; + } + printf("strerror() missing string for errnum=%d\n", errnum); + return "Unknown error"; +} + } diff --git a/LibC/string.h b/LibC/string.h index 21e4ccf287..15d0dbf1bf 100644 --- a/LibC/string.h +++ b/LibC/string.h @@ -5,6 +5,7 @@ extern "C" { size_t strlen(const char*); +const char* strerror(int errnum); } diff --git a/LibC/unistd.cpp b/LibC/unistd.cpp index 814346e075..335645e91b 100644 --- a/LibC/unistd.cpp +++ b/LibC/unistd.cpp @@ -1,5 +1,6 @@ #include "unistd.h" #include "string.h" +#include "errno.h" #include extern "C" { @@ -22,35 +23,38 @@ pid_t getpid() int open(const char* path) { size_t length = strlen(path); - return Syscall::invoke(Syscall::PosixOpen, (dword)path, (dword)length); + int rc = Syscall::invoke(Syscall::PosixOpen, (dword)path, (dword)length); + __RETURN_WITH_ERRNO(rc, rc, -1); } ssize_t read(int fd, void* buf, size_t count) { - return Syscall::invoke(Syscall::PosixRead, (dword)fd, (dword)buf, (dword)count); + int rc = Syscall::invoke(Syscall::PosixRead, (dword)fd, (dword)buf, (dword)count); + __RETURN_WITH_ERRNO(rc, rc, -1); } int close(int fd) { - return Syscall::invoke(Syscall::PosixClose, fd); + int rc = Syscall::invoke(Syscall::PosixClose, fd); + __RETURN_WITH_ERRNO(rc, rc, -1); } pid_t waitpid(pid_t waitee) { - return Syscall::invoke(Syscall::PosixWaitpid, waitee); + int rc = Syscall::invoke(Syscall::PosixWaitpid, waitee); + __RETURN_WITH_ERRNO(rc, rc, -1); } int lstat(const char* path, stat* statbuf) { - return Syscall::invoke(Syscall::PosixLstat, (dword)path, (dword)statbuf); + int rc = Syscall::invoke(Syscall::PosixLstat, (dword)path, (dword)statbuf); + __RETURN_WITH_ERRNO(rc, rc, -1); } char* getcwd(char* buffer, size_t size) { int rc = Syscall::invoke(Syscall::PosixGetcwd, (dword)buffer, (dword)size); - if (rc != 0) - return nullptr; - return buffer; + __RETURN_WITH_ERRNO(rc, buffer, nullptr); } } diff --git a/Userland/sh.cpp b/Userland/sh.cpp index 68d4cc24b3..35905dc861 100644 --- a/Userland/sh.cpp +++ b/Userland/sh.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include static void prompt() { @@ -12,12 +14,14 @@ static void prompt() static int runcmd(char* cmd) { + if (cmd[0] == 0) + return 0; //printf("command: '%s'\n", cmd); char buf[128]; sprintf(buf, "/bin/%s", cmd); int ret = spawn(buf); if (ret == -1) { - printf("spawn failed: %s\n", cmd); + printf("spawn failed: %s (%s)\n", cmd, strerror(errno)); return 1; } waitpid(ret);