* Make the ksym table built-in with kernel image, thus remove the need
authorMinep <lunaixsky@qq.com>
Sat, 2 Mar 2024 15:56:19 +0000 (15:56 +0000)
committerMinep <lunaixsky@qq.com>
Sat, 2 Mar 2024 16:02:30 +0000 (16:02 +0000)
  of grub side-loaded module. This include a two-stage linking: first
  pass is used to generate relocated symbol address and populate the
  ksymtable; second pass is to link the ksymtable into the kernel.

* Fix an issue within terminal signal delivery, which always deliver
  SIGINT due to a typo

* Fix the issue where pwait is waken by SIGINT, the next pwait call
  will fail the invariant assertion check

14 files changed:
lunaix-os/.gitignore
lunaix-os/GRUB_TEMPLATE
lunaix-os/arch/i386/mm/pmm.c
lunaix-os/bochs.cfg [deleted file]
lunaix-os/hal/term/lcntls/lcntl.c
lunaix-os/includes/lunaix/trace.h
lunaix-os/kernel.mk
lunaix-os/kernel/debug/trace.c
lunaix-os/kernel/ds/waitq.c
lunaix-os/link/linker.ld
lunaix-os/makeinc/toolchain.mkinc
lunaix-os/scripts/gen_ksymtable.sh [new file with mode: 0755]
lunaix-os/scripts/syms_export.py [deleted file]
lunaix-os/scripts/test_ksyms.c [deleted file]

index a7f6eaf9b850d71107a09e4d567f5cc4ccbc1bf0..438c74f7ac7ded251dd7b65d1f7dcfa5cd6f1f86 100644 (file)
@@ -17,3 +17,5 @@ __pycache__/
 **.d
 
 *.log
+
+.lunaix_ksymtable.S
\ No newline at end of file
index db98366aafb1a36d8e3cfb1a461b2c6f53eb9e11..c05136f49e01a9951b8efc22e08b443480bb398f 100644 (file)
@@ -3,5 +3,4 @@ timeout=0
 
 menuentry "$_OS_NAME" {
        multiboot /boot/kernel.bin $KCMD
-       module --nounzip /boot/modksyms modksyms
 }
\ No newline at end of file
index 7a6ef2957c10e00885b198ad88d581881728a6e4..45b7e4e303fc36084e7e156372a4af2e7a75378b 100644 (file)
@@ -31,13 +31,6 @@ found:;
     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) {
diff --git a/lunaix-os/bochs.cfg b/lunaix-os/bochs.cfg
deleted file mode 100644 (file)
index 0011df5..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-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
index de3334cbb408e02830a5c0289b533d24856d5a20..db146e1d84de8f915469dd184a658e47d2276ccf 100644 (file)
@@ -17,7 +17,7 @@
 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;
 }
 
index c0208bd9eae21fc5c60c6d1ed53de7fd1af01aa8..9409c36378de29e20ee09f182f181c77f1753258 100644 (file)
@@ -7,8 +7,8 @@
 struct ksym_entry
 {
     ptr_t pc;
-    u32_t label_off;
-};
+    char* label;
+} align(8);
 
 struct trace_record
 {
@@ -19,8 +19,7 @@ struct trace_record
 
 struct ksyms
 {
-    u32_t ksym_count;
-    u32_t ksym_label_off;
+    unsigned long ksym_count;
     struct ksym_entry syms[0];
 };
 
index 9d6ca02ec5fc271e23aa4b2988e320d64108ca74..189e97046385d7ffa581e5e52467bbf3cab2f3b3 100644 (file)
@@ -27,6 +27,8 @@ ksrc_deps := $(addsuffix .d,$(ksrc_files))
 
 kinc_opts := $(addprefix -I,$(kinc_dirs))
 
+tmp_kbin  := $(BUILD_DIR)/tmpk.bin
+ksymtable := lunaix_ksyms.o
 
 CFLAGS += -include flags.h
 CFLAGS += -include config.h
@@ -39,18 +41,25 @@ 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
index 173b1cd09d0d14b57d60d748f4297b011ff87d12..0a70de353bf83436cdde7e5afa6498686ed6a322 100644 (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;
@@ -74,8 +63,7 @@ ksym_getstr(struct ksym_entry* sym)
         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) {
@@ -123,9 +111,9 @@ static inline void
 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);
     }
 }
 
index c9fb88f3fede01cffd78d3900e33027f05d28457..522974fbcf6b84fc939f2d9f4c55ed1599839638 100644 (file)
@@ -18,6 +18,8 @@ pwait(waitq_t* queue)
     block_current_thread();
     sched_pass();
 
+    // In case of SIGINT-forced awaken
+    llist_delete(&current_wq->waiters);
     cpu_enable_interrupt();
 }
 
index 93c9693961b039b2678a1aff7a9898d7dfe0bba4..c3d57dac72cf24b6fdbd9fa7e1f2b8b134be8d3c 100644 (file)
@@ -180,6 +180,11 @@ SECTIONS {
 
     }
 
+    .ksymtable BLOCK(4K) : AT ( ADDR(.ksymtable) - 0xC0000000 )
+    {
+        *(.ksymtable)
+    }
+
     .bss BLOCK(4K) : AT ( ADDR(.bss) - 0xC0000000 ) 
     {
         *(.bss)
index 7421f45736d48386766e1aee0c1bc8c303bf8ae2..c9d085f9eca72d7c37ed9f90dc5fe92f669b5774 100644 (file)
@@ -2,7 +2,6 @@ CC := $(CX_PREFIX)gcc
 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
diff --git a/lunaix-os/scripts/gen_ksymtable.sh b/lunaix-os/scripts/gen_ksymtable.sh
new file mode 100755 (executable)
index 0000000..6b59e4d
--- /dev/null
@@ -0,0 +1,54 @@
+#!/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
diff --git a/lunaix-os/scripts/syms_export.py b/lunaix-os/scripts/syms_export.py
deleted file mode 100644 (file)
index 7edbfcb..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-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)
-
diff --git a/lunaix-os/scripts/test_ksyms.c b/lunaix-os/scripts/test_ksyms.c
deleted file mode 100644 (file)
index dbc33b0..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-#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));
-    }
-}