**.d
*.log
+
+.lunaix_ksymtable.S
\ No newline at end of file
menuentry "$_OS_NAME" {
multiboot /boot/kernel.bin $KCMD
- module --nounzip /boot/modksyms modksyms
}
\ No newline at end of file
ptr_t kexec_end = to_kphysical(__kexec_end);
ptr_t aligned_pplist = MAX(ent->start, kexec_end);
- // FIXME this is a temporary hack, we need a better way to convey
- // the mem-map for us to settle the pplist safely
-
- for (i = 0; i <bctx->mods.mods_num; i++) {
- aligned_pplist = MAX(aligned_pplist, bctx->mods.entries[i].end);
- }
-
aligned_pplist = napot_upaligned(aligned_pplist, L0T_SIZE);
if (aligned_pplist + pool_size > ent->start + ent->size) {
+++ /dev/null
-ata0-master: type=cdrom, path="build/lunaix.iso", status=inserted
-
-memory: guest=1024, host=1024
-
-clock: sync=realtime, time0=utc, rtc_sync=1
-
-display_library: x, options="gui_debug"
-
-boot: cdrom
\ No newline at end of file
static inline void
raise_sig(struct term* at_term, struct linebuffer* lbuf, int sig)
{
- term_sendsig(at_term, SIGINT);
+ term_sendsig(at_term, sig);
lbuf->sflags |= LSTATE_SIGRAISE;
}
struct ksym_entry
{
ptr_t pc;
- u32_t label_off;
-};
+ char* label;
+} align(8);
struct trace_record
{
struct ksyms
{
- u32_t ksym_count;
- u32_t ksym_label_off;
+ unsigned long ksym_count;
struct ksym_entry syms[0];
};
kinc_opts := $(addprefix -I,$(kinc_dirs))
+tmp_kbin := $(BUILD_DIR)/tmpk.bin
+ksymtable := lunaix_ksyms.o
CFLAGS += -include flags.h
CFLAGS += -include config.h
$(call status_,CC,$<)
@$(CC) $(CFLAGS) $(kinc_opts) -c $< -o $@
-$(kbin_dir)/modksyms: $(kbin)
- $(call status_,MOD,$@)
- @$(PY) scripts/syms_export.py --bits=32 --order=little -o "$@" "$<"
+$(tmp_kbin): $(ksrc_objs)
+ $(call status_,LD,$@)
+ @$(CC) -T link/linker.ld $(LDFLAGS) -o $@ $^
+
+$(ksymtable): $(tmp_kbin)
+ $(call status_,KSYM,$@)
+ @scripts/gen_ksymtable.sh DdRrTtAGg $< > .lunaix_ksymtable.S
+ @$(CC) $(CFLAGS) -c .lunaix_ksymtable.S -o $@
.PHONY: __do_relink
-__do_relink: $(ksrc_objs)
+__do_relink: $(ksrc_objs) $(ksymtable)
$(call status_,LD,$(kbin))
- @$(CC) -T link/linker.ld -o $(kbin) $(ksrc_objs) $(LDFLAGS)
+ @$(CC) -T link/linker.ld $(LDFLAGS) -o $(kbin) $^
+ @rm $(tmp_kbin)
.PHONY: all
-all: __do_relink $(kbin_dir)/modksyms
+all: __do_relink
clean:
@rm -f $(ksrc_objs)
- @rm -f $(ksrc_deps)
\ No newline at end of file
+ @rm -f $(ksrc_deps)
+ @rm -f .lunaix_ksymtable.S $(ksymtable)
\ No newline at end of file
LOG_MODULE("TRACE")
+weak struct ksyms __lunaix_ksymtable[] = { };
+extern struct ksyms __lunaix_ksymtable[];
+
static struct trace_context trace_ctx;
void
trace_modksyms_init(struct boot_handoff* bhctx)
{
- struct boot_modent* modents = bhctx->mods.entries;
- for (size_t i = 0; i < bhctx->mods.mods_num; i++) {
- struct boot_modent* mod = &bhctx->mods.entries[i];
- if (streq(mod->str, "modksyms")) {
- assert(!va_offset(mod->start));
-
- pte_t pte = mkpte(mod->start, KERNEL_DATA);
- size_t n = pfn(mod->end) - pfn(mod->start);
-
- ptr_t ksym_va = vmap_leaf_ptes(pte, n);
-
- assert(ksym_va);
- trace_ctx.ksym_table = (struct ksyms*)ksym_va;
- }
- }
+ trace_ctx.ksym_table = __lunaix_ksymtable;
}
struct ksym_entry*
trace_sym_lookup(ptr_t addr)
{
- int c = trace_ctx.ksym_table->ksym_count;
+ unsigned long c = trace_ctx.ksym_table->ksym_count;
struct ksym_entry* ksent = trace_ctx.ksym_table->syms;
int i = c - 1, j = 0, m = 0;
return "???";
}
- return (char*)((ptr_t)trace_ctx.ksym_table +
- trace_ctx.ksym_table->ksym_label_off + sym->label_off);
+ return sym->label;
}
static inline bool valid_fp(ptr_t ptr) {
trace_print_code_entry(ptr_t sym_pc, ptr_t inst_pc, char* sym)
{
if (sym_pc) {
- DEBUG("%p+%p: %s", sym_pc, inst_pc - sym_pc, sym);
+ DEBUG("%s+%p", sym, inst_pc - sym_pc);
} else {
- DEBUG("%p+%p: %s", inst_pc, sym_pc, sym);
+ DEBUG("%s [%p]", sym, sym_pc);
}
}
block_current_thread();
sched_pass();
+ // In case of SIGINT-forced awaken
+ llist_delete(¤t_wq->waiters);
cpu_enable_interrupt();
}
}
+ .ksymtable BLOCK(4K) : AT ( ADDR(.ksymtable) - 0xC0000000 )
+ {
+ *(.ksymtable)
+ }
+
.bss BLOCK(4K) : AT ( ADDR(.bss) - 0xC0000000 )
{
*(.bss)
CC := $(CX_PREFIX)gcc
AS := $(CX_PREFIX)as
AR := $(CX_PREFIX)ar
-PY := python3
STRIP_OSDEP_CC := -ffreestanding -fno-pie
STRIP_OSDEP_LD := -nostdlib -nolibc -z noexecstack -no-pie -Wl,--build-id=none
--- /dev/null
+#!/bin/bash
+
+sym_types=$1
+bin=$2
+
+nm_out=$(nm -nfbsd "$bin")
+allsyms=($nm_out)
+allsyms_len=${#allsyms[@]}
+
+syms_idx=()
+
+for (( i=0; i<allsyms_len; i+=3));
+do
+ type=${allsyms[$i + 1]}
+
+ if [[ "$sym_types" == *"$type"* ]]; then
+ syms_idx+=($i)
+ fi
+done
+
+syms_len=${#syms_idx[@]}
+declare -A assoc_array
+
+echo '.section .ksymtable, "a", @progbits'
+echo " .global __lunaix_ksymtable"
+echo " __lunaix_ksymtable:"
+echo " .long $syms_len"
+echo " .align 8"
+
+for i in "${syms_idx[@]}"
+do
+ addr=${allsyms[$i]}
+ type=${allsyms[$i + 1]}
+ sym=${allsyms[$i + 2]}
+
+ echo "$(cat <<EOF
+ .long 0x$addr
+ .long __S$sym
+ .align 8
+
+EOF
+)"
+ assoc_array["$sym"]=1
+done
+
+for sym_str in "${!assoc_array[@]}"
+do
+ echo "$(cat <<EOF
+ __S$sym_str:
+ .asciz "$sym_str"
+ .align 8
+EOF
+)"
+done
\ No newline at end of file
+++ /dev/null
-import subprocess
-import math
-import re
-
-sym_line = re.compile(r"^(?P<addr>[0-9a-f]+)\s[a-z]\s+F\s+\.[a-z._]+\s+[0-9a-f]+(?P<label>.+)$")
-
-def main(kbin, sym_out, endianness='little', bits=32, just_print=False):
- assert bits >= 32
- assert (1 << int(math.log2(bits))) == bits
-
- b_len = bits // 8
- result = subprocess.run(["objdump", "--syms", kbin],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- if result.returncode != 0:
- print(result.stderr)
- return
-
- def to_native(val: int):
- return val.to_bytes(b_len, endianness, signed=False)
-
- output = result.stdout.split(b'\n')
- functions = []
- for l in output:
- l = l.decode("ascii")
- if not l:
- continue
-
- mo = sym_line.match(l)
- if not mo:
- continue
-
- mg = mo.groupdict()
- addr = int(mg["addr"], 16)
- label = mg["label"].strip() + '\0'
-
- functions.append((addr, label))
-
- functions = sorted(functions, key=lambda x: x[0])
-
- if just_print:
- for (a, l) in functions:
- print(hex(a), ":", l)
- return
-
- # struct {
- # ptr_t addr;
- # unsigned int label_off;
- # }
- sym_struct_sz = b_len * 2
- meta_struct_sz = 4 * 2
- label_off_base = sym_struct_sz * len(functions) + meta_struct_sz
- alignment = bytearray([b'\0' for _ in range(b_len - 4)])
-
- label_off = 0
- bmask = b_len - 1
- text_region = bytearray()
- null = bytearray(b'\0')
- with open(sym_out, mode='wb') as f:
- # struct {
- # unsigned int num_entry;
- # unsigned int label_off_base;
- # }
- f.write(to_native(len(functions)))
- f.write(to_native(label_off_base))
-
- for a, l in functions:
- f.write(to_native(a))
- f.write(to_native(label_off))
- f.write(alignment)
-
- text_region += bytes(l, 'ascii')
- aligned_len = (len(l) + bmask) & ~bmask
- for i in range(aligned_len - len(l)):
- text_region.append(null[0])
-
- label_off += aligned_len
-
- f.write(text_region)
-
-import argparse
-import sys
-if __name__ == "__main__":
- parser = argparse.ArgumentParser()
- parser.add_argument('elf_exec')
- parser.add_argument('-o', '--outfile', required=True)
- parser.add_argument('--bits', default=32)
- parser.add_argument('--order', default='little')
- parser.add_argument('-p', '--just-print', action='store_true')
-
- args = parser.parse_args()
-
- main(args.elf_exec, args.outfile, endianness=args.order, bits=int(args.bits), just_print=args.just_print)
-
+++ /dev/null
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <sys/mman.h>
-#include <unistd.h>
-
-struct ksyms_meta
-{
- unsigned int entries;
- unsigned int label_off_base;
-};
-
-struct ksyms_entry
-{
- unsigned int addr;
- unsigned int off;
-};
-
-void
-main()
-{
- int fd = open("ksyms", O_RDONLY);
- void* data = mmap(0, 0x6000, PROT_READ, MAP_PRIVATE, fd, 0);
-
- printf("mapped at: %p\n", data);
-
- if (data == 0) {
- printf("unable to map, %d", errno);
- return;
- }
-
- close(fd);
-
- struct ksyms_meta* meta = (struct ksyms_meta*)data;
-
- printf(
- "entires: %d, label_base: %p\n", meta->entries, meta->label_off_base);
-
- struct ksyms_entry* entries = (struct ksyms_entry*)(meta + 1);
- for (int i = 0; i < meta->entries; i++) {
- struct ksyms_entry* entry = &entries[i];
- printf(
- "addr: %p, off: %p, label: %s\n",
- entry->addr,
- entry->off,
- (char*)((unsigned long)data + meta->label_off_base + entry->off));
- }
-}