diff options
author | Richard Braun <rbraun@sceen.net> | 2018-06-26 22:12:18 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2018-06-26 22:12:18 +0200 |
commit | b2ff0c98f026fa7feda1b658979c7e2d04404ae6 (patch) | |
tree | 949a9d42b7308457b2df75e6d11d90759384c1dc /kern | |
parent | a6541cd67767e6c12841e8d91304e2ef3fa26995 (diff) | |
parent | 186d6a966ea70997846a95dd8c34b2e3e7f74145 (diff) |
Merge branch 'symtab'
Diffstat (limited to 'kern')
-rw-r--r-- | kern/Makefile | 1 | ||||
-rw-r--r-- | kern/macros.h | 4 | ||||
-rw-r--r-- | kern/panic.c | 3 | ||||
-rw-r--r-- | kern/symbol.c | 49 | ||||
-rw-r--r-- | kern/symbol.h | 45 |
5 files changed, 100 insertions, 2 deletions
diff --git a/kern/Makefile b/kern/Makefile index 5b04fcb3..ea7e3bff 100644 --- a/kern/Makefile +++ b/kern/Makefile @@ -29,6 +29,7 @@ x15_SOURCES-y += \ kern/spinlock.c \ kern/sref.c \ kern/string.c \ + kern/symbol.c \ kern/syscnt.c \ kern/task.c \ kern/thread.c \ diff --git a/kern/macros.h b/kern/macros.h index 6d136e3e..ddd9e587 100644 --- a/kern/macros.h +++ b/kern/macros.h @@ -105,6 +105,10 @@ #define __used __attribute__((used)) #endif +#ifndef __weak +#define __weak __attribute__((weak)) +#endif + #ifndef __fallthrough #if __GNUC__ >= 7 #define __fallthrough __attribute__((fallthrough)) diff --git a/kern/panic.c b/kern/panic.c index c610e3fa..bd1f6658 100644 --- a/kern/panic.c +++ b/kern/panic.c @@ -64,5 +64,4 @@ panic_setup(void) INIT_OP_DEFINE(panic_setup, INIT_OP_DEP(cpu_setup, true), - INIT_OP_DEP(printf_setup, true), - INIT_OP_DEP(strace_setup, true)); + INIT_OP_DEP(printf_setup, true)); diff --git a/kern/symbol.c b/kern/symbol.c new file mode 100644 index 00000000..30df091e --- /dev/null +++ b/kern/symbol.c @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018 Agustina Arzille. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <stddef.h> +#include <stdint.h> + +#include <kern/macros.h> +#include <kern/symbol.h> + +const size_t symbol_table_size __weak; +const struct symbol *symbol_table_ptr __weak; + +const struct symbol * +symbol_lookup(uintptr_t addr) +{ + const struct symbol *symbol; + uintptr_t start, end; + + for (size_t i = 0; i < symbol_table_size; i++) { + symbol = &symbol_table_ptr[i]; + + if (!symbol->name || (symbol->size == 0)) { + continue; + } + + start = symbol->addr; + end = symbol->addr + symbol->size; + + if ((addr >= start) && (addr < end)) { + return symbol; + } + } + + return NULL; +} diff --git a/kern/symbol.h b/kern/symbol.h new file mode 100644 index 00000000..61fbf3f0 --- /dev/null +++ b/kern/symbol.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018 Agustina Arzille. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KERN_SYMBOL_H +#define KERN_SYMBOL_H + +#include <stdint.h> + +#include <kern/macros.h> + +#define __symbol_table __section(".symbol") + +/* + * Symbol structure. + * + * This structure is public. + */ +struct symbol { + uintptr_t addr; + uintptr_t size; + const char *name; +}; + +/* + * Look up a symbol from an address. + * + * NULL is returned if no symbol was found for the given address. + */ +const struct symbol * symbol_lookup(uintptr_t addr); + +#endif /* KERN_SYMBOL_H */ |