diff options
Diffstat (limited to 'kjarna_runtime')
| -rw-r--r-- | kjarna_runtime/Makefile | 37 | ||||
| -rw-r--r-- | kjarna_runtime/dynamic_x86_64.c | 139 | ||||
| -rw-r--r-- | kjarna_runtime/kc.h | 46 | ||||
| -rw-r--r-- | kjarna_runtime/kc.ld | 97 | ||||
| -rw-r--r-- | kjarna_runtime/kjarna.c | 13 | ||||
| -rw-r--r-- | kjarna_runtime/main.c | 17 | ||||
| -rw-r--r-- | kjarna_runtime/start_x86_64.S | 63 |
7 files changed, 0 insertions, 412 deletions
diff --git a/kjarna_runtime/Makefile b/kjarna_runtime/Makefile deleted file mode 100644 index d6e762d..0000000 --- a/kjarna_runtime/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -include ../defaults.mk - -LDFLAGS += -z max-page-size=4096 --export-dynamic -pic \ - -z separate-code -pie -Bsymbolic -shared \ - -z noexecstack -g - -VPATH := ../lib - -TARGET := kjarna.os -.DEFAULT: $(TARGET) - -CPPFLAGS += -I../api/posix -I../api/libc -I../api -I. - -CFLAGS += -fPIC -fvisibility=hidden -mgeneral-regs-only - -LDSCRIPT := kc.ld - -CRT_OBJS := start_x86_64.o dynamic_x86_64.o elf64.o kjarna.o -LIB_OBJS := memcmp.o memcpy.o memmove.o memset.o string.o stdio.o \ - printf.o -APP_OBJS := main.o - -OBJS := $(CRT_OBJS) $(LIB_OBJS) $(APP_OBJS) - -DEPS := $(patsubst %.o,%.d,$(OBJS)) - -$(TARGET): $(LDSCRIPT) $(MAKEFILE_LIST) -$(TARGET): $(OBJS) - -CLEANLIST := $(wildcard $(OBJS) $(TARGET)) -DCLEANLIST := $(wildcard $(DEPS)) - -include ../rules.mk --include $(DEPS) - -.DEFAULT: $(TARGET) - diff --git a/kjarna_runtime/dynamic_x86_64.c b/kjarna_runtime/dynamic_x86_64.c deleted file mode 100644 index 02538ec..0000000 --- a/kjarna_runtime/dynamic_x86_64.c +++ /dev/null @@ -1,139 +0,0 @@ -#include <kc.h> - -#include <libc/string.h> -#include <lib/elf.h> - -extern void _rtld_link(void); - -struct elf64_relatab -{ - Elf64_Rela *entries; - size_t size; - size_t entsize; -}; - -struct elf64_symtab -{ - Elf64_Sym *entries; - const char *strings; - size_t strsize; -}; - -struct elf64_dso_info -{ - char *base; - struct elf64_relatab jmprel; - struct elf64_relatab reladyn; - struct elf64_symtab dynsym; - Elf64_Addr *pltgot; -}; - -static struct elf64_dso_info dso_info; - -void kc_dynamic_init(char *base, Elf64_Dyn *dyn) -{ - dso_info = (struct elf64_dso_info) - { - base, - { - elf64_dt_ptr(base, dyn, DT_JMPREL), - elf64_dt_val(dyn, DT_PLTRELSZ), - elf64_dt_val(dyn, DT_PLTREL) == DT_RELA ? sizeof(Elf64_Rela) : -1 - }, - { - elf64_dt_ptr(base, dyn, DT_RELA), - elf64_dt_val(dyn, DT_RELASZ), - elf64_dt_val(dyn, DT_RELAENT) - }, - { - elf64_dt_ptr(base, dyn, DT_SYMTAB), - elf64_dt_ptr(base, dyn, DT_STRTAB), - elf64_dt_val(dyn, DT_STRSZ) - }, - elf64_dt_ptr(base, dyn, DT_PLTGOT) - }; - - if (dso_info.pltgot != nullptr) - { - dso_info.pltgot[1] = (uintptr_t)&dso_info; - dso_info.pltgot[2] = (uintptr_t)_rtld_link; - } - - kc_dynamic_reloc(base, &dso_info.jmprel); - kc_dynamic_reloc(base, &dso_info.reladyn); -} - -void *kc_dynamic_link(struct elf64_dso_info *dso, int index) -{ - struct kjarna_interface *ftab = entry_params->interface; - - int symindex = ELF64_R_SYM(dso->jmprel.entries[index].r_info); - int strindex = dso->dynsym.entries[symindex].st_name; - const char *name = &dso->dynsym.strings[strindex]; - uintptr_t *fixup = (uintptr_t *)(dso->base + dso->jmprel.entries[index].r_offset); - - // TODO: generate a symbol table for kjarna interface - // TODO: implement symbol lookup (maybe hashed too) - if (strcmp(name, "open") == 0) - { - *fixup = (uintptr_t)*ftab->open; - } - else if (strcmp(name, "close") == 0) - { - *fixup = (uintptr_t)*ftab->close; - } - else if (strcmp(name, "read") == 0) - { - *fixup = (uintptr_t)*ftab->read; - } - else if (strcmp(name, "write") == 0) - { - *fixup = (uintptr_t)*ftab->write; - } - else if (strcmp(name, "lseek") == 0) - { - *fixup = (uintptr_t)*ftab->lseek; - } - else if (strcmp(name, "mmap") == 0) - { - *fixup = (uintptr_t)*ftab->mmap; - } - else if (strcmp(name, "munmap") == 0) - { - *fixup = (uintptr_t)*ftab->munmap; - } - else - { - return nullptr; - } - - return fixup; -} - -static void do_rela(char *base, Elf64_Rela *rela) -{ - uintptr_t *fixup = (uintptr_t *)(base + rela->r_offset); - - switch (ELF64_R_TYPE(rela->r_info)) - { - case R_X86_64_JUMP_SLOT: - *fixup += (uintptr_t)base; - break; - case R_X86_64_RELATIVE: - *fixup = (uintptr_t)(rela->r_addend + base); - break; - default: - break; - } -} - -void kc_dynamic_reloc(char *base, struct elf64_relatab *rela) -{ - size_t entries = rela->size / rela->entsize; - - for (size_t i = 0; rela->entries && (i < entries); i++) - { - do_rela(base, &rela->entries[i]); - } -} - diff --git a/kjarna_runtime/kc.h b/kjarna_runtime/kc.h deleted file mode 100644 index ff3a1ca..0000000 --- a/kjarna_runtime/kc.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -#ifndef __ASSEMBLER__ - -#include <elf/elf64.h> - -#include <stddef.h> - -#include <kjarna/interface.h> - -extern struct kjarna_entry_params *entry_params; - -#define KC_EXPORT __attribute__((visibility("default"))) - -extern unsigned char kc_image_base; -extern unsigned char kc_text_begin; -extern unsigned char kc_text_end; -extern unsigned char kc_rodata_begin; -extern unsigned char kc_data_begin; -extern unsigned char kc_data_end; -extern unsigned char kc_image_end; - -struct elf64_dso_info; -struct elf64_relatab; - -extern void kc_dynamic_init(char *base, Elf64_Dyn *dyn); -extern void *kc_dynamic_link(struct elf64_dso_info *dso, int index); -extern void kc_dynamic_reloc(char *base, struct elf64_relatab *dso); - -#else - -.extern kc_image_base -.extern kc_text_begin -.extern kc_text_end -.extern kc_rodata_begin -.extern kc_rodata_end -.extern kc_data_begin -.extern kc_data_end -.extern kc_image_end -.extern _DYNAMIC - -.extern kc_dynamic_init -.extern kc_dynamic_link - -#endif // __ASSEMBLER__ - diff --git a/kjarna_runtime/kc.ld b/kjarna_runtime/kc.ld deleted file mode 100644 index f7b0339..0000000 --- a/kjarna_runtime/kc.ld +++ /dev/null @@ -1,97 +0,0 @@ -ENTRY(_start) - -SECTIONS -{ - PROVIDE_HIDDEN(kc_image_base = .); - - . = SIZEOF_HEADERS; - - .rela.plt : - { - *(.rela.plt) - } - - .rela.dyn : - { - *(.rela.dyn) - } - - .hash : - { - *(.hash) - } - - .dynsym : - { - *(.dynsym) - } - - .dynstr : - { - *(.dynstr) - } - - .rodata : - { - *(.rodata) - *(.rodata.*) - } - - .text : ALIGN(4K) - { - PROVIDE_HIDDEN(kc_text_begin = .); - *(.text.start) - *(.text) - } - - .plt : - { - *(.plt) - . = ALIGN(4K); - PROVIDE_HIDDEN(kc_text_end = .); - } =0xcc - - .dynamic : ALIGN(4K) - { - PROVIDE_HIDDEN(kc_data_begin = .); - *(.dynamic) - } - - .got : - { - *(.got) - } - - .got.plt : - { - *(.got.plt) - } - - .data : - { - *(.data) - } - - .data.rel : - { - *(.data.rel) - *(.data.rel.*) - } - - .bss : - { - *(.bss) - *(.dynbss) - . = ALIGN(4K); - PROVIDE_HIDDEN(kc_data_end = .); - } - - PROVIDE_HIDDEN(kc_image_end = .); - - /DISCARD/ : - { - *(.eh_frame) - *(.comment) - } -} - diff --git a/kjarna_runtime/kjarna.c b/kjarna_runtime/kjarna.c deleted file mode 100644 index 6b37d1e..0000000 --- a/kjarna_runtime/kjarna.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <kjarna/interface.h> - -struct kjarna_entry_params *entry_params; - -extern int main(int argc, char **argv); - -int kjarna_entry(struct kjarna_entry_params *params) -{ - entry_params = params; - - return main(params->argc, params->argv); -} - diff --git a/kjarna_runtime/main.c b/kjarna_runtime/main.c deleted file mode 100644 index 12a5522..0000000 --- a/kjarna_runtime/main.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <unistd.h> -#include <stdio.h> - -#define KJARNA_REVISION 1 - -int main(int argc, char **argv) -{ - (void)argc; - (void)argv; - - printf("kjarna %d\n", KJARNA_REVISION); - - while (1); - - return 0; -} - diff --git a/kjarna_runtime/start_x86_64.S b/kjarna_runtime/start_x86_64.S deleted file mode 100644 index 19db34f..0000000 --- a/kjarna_runtime/start_x86_64.S +++ /dev/null @@ -1,63 +0,0 @@ -#include <kc.h> - -.section .text.start - -.extern kjarna_entry - -.hidden _start -.global _start -.type _start, @function -_start: - push %rbp - push %rdi - push %rsi - mov %rsp, %rbp - and $-0x10, %rsp - lea kc_image_base(%rip), %rdi - lea _DYNAMIC(%rip), %rsi - call kc_dynamic_init - mov %rbp, %rsp - pop %rsi - pop %rdi - mov %rsp, %rbp - and $-0x10, %rsp - call kjarna_entry - mov %rbp, %rsp - pop %rbp - ret -.size _start, . - _start - -.section .text - -.hidden _rtld_link -.global _rtld_link -.type _rtld_link, @function -_rtld_link: - push %rbp - mov %rsp, %rbp - push %r9 - push %r8 - push %rcx - push %rdx - push %rsi - push %rdi - mov 8(%rbp), %rdi - mov 16(%rbp), %rsi - push %rbp - mov %rsp, %rbp - and $-0x10, %rsp - call kc_dynamic_link - mov %rbp, %rsp - pop %rbp - pop %rdi - pop %rsi - pop %rdx - pop %rcx - pop %r8 - pop %r9 - mov %rbp, %rsp - pop %rbp - add $0x10, %rsp - jmp *(%rax) -.size _rtld_link, . - _rtld_link - |
