Started implementing debugging facilities
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -169,3 +169,4 @@ $RECYCLE.BIN/
|
|||||||
build
|
build
|
||||||
.clang-format
|
.clang-format
|
||||||
.ccls-cache
|
.ccls-cache
|
||||||
|
socks.log
|
||||||
|
|||||||
5
Makefile
5
Makefile
@@ -17,8 +17,9 @@ KERNEL_OBJ := $(addprefix $(BUILDDIR)/,$(KERNEL_C_FILES:.c=.o))
|
|||||||
|
|
||||||
BUILD_ID := $(shell tools/generate_build_id.py --arch $(ARCH))
|
BUILD_ID := $(shell tools/generate_build_id.py --arch $(ARCH))
|
||||||
|
|
||||||
CFLAGS := -DBUILD_ID=\"$(BUILD_ID)\"
|
CFLAGS := $(CFLAGS) -DBUILD_ID=\"$(BUILD_ID)\" -g
|
||||||
ASMFLAGS := -DBUILD_ID=\"$(BUILD_ID)\"
|
ASMFLAGS := $(ASMFLAGS) -DBUILD_ID=\"$(BUILD_ID)\"
|
||||||
|
LDFLAGS := $(LDFLAGS) -g
|
||||||
|
|
||||||
$(BUILDDIR)/$(KERNEL_EXEC): $(KERNEL_OBJ) $(ARCH_OBJ)
|
$(BUILDDIR)/$(KERNEL_EXEC): $(KERNEL_OBJ) $(ARCH_OBJ)
|
||||||
@echo " \033[1;36mLINK\033[0m \033[1m$@\033[0m"
|
@echo " \033[1;36mLINK\033[0m \033[1m$@\033[0m"
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
QEMU := qemu-system-x86_64
|
QEMU := qemu-system-x86_64
|
||||||
|
QEMU_FLAGS := -m 64M -smp 4
|
||||||
|
|
||||||
ARCH_TEMP_FILES := $(BUILDDIR)/$(KERNEL_EXEC).elf32
|
ARCH_TEMP_FILES := $(BUILDDIR)/$(KERNEL_EXEC).elf32
|
||||||
|
|
||||||
@@ -16,8 +17,13 @@ run: $(BUILDDIR)/$(KERNEL_EXEC) $(BUILDDIR)/$(KERNEL_EXEC).elf32
|
|||||||
@$(QEMU) -kernel $(BUILDDIR)/$(KERNEL_EXEC).elf32
|
@$(QEMU) -kernel $(BUILDDIR)/$(KERNEL_EXEC).elf32
|
||||||
|
|
||||||
debug: $(BUILDDIR)/$(KERNEL_EXEC) $(BUILDDIR)/$(KERNEL_EXEC).elf32
|
debug: $(BUILDDIR)/$(KERNEL_EXEC) $(BUILDDIR)/$(KERNEL_EXEC).elf32
|
||||||
@echo " \033[1;93mBOOT\033[0m $<"
|
@echo " \033[1;93mDEBUG\033[0m $<"
|
||||||
|
|
||||||
|
@./tools/kernel-debug/debug_session.sh \
|
||||||
|
tools/kernel-debug/gdb_session_init \
|
||||||
|
tools/kernel-debug/lldb_session_init \
|
||||||
|
$(QEMU) \
|
||||||
|
-kernel $(BUILDDIR)/$(KERNEL_EXEC).elf32 -S -s \
|
||||||
|
-curses -serial file:socks.log $(QEMU_FLAGS)
|
||||||
|
|
||||||
|
|
||||||
@$(QEMU) \
|
|
||||||
-kernel $(BUILDDIR)/$(KERNEL_EXEC).elf32 -S -s \
|
|
||||||
-monitor stdio
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ bootstrap_pdpt: # a single PDPT
|
|||||||
bootstrap_pdir_buf: # a buffer of page directories. each pdir entry can be used to map 2MB of virtual memory.
|
bootstrap_pdir_buf: # a buffer of page directories. each pdir entry can be used to map 2MB of virtual memory.
|
||||||
.skip BOOTSTRAP_PDIR_SIZE
|
.skip BOOTSTRAP_PDIR_SIZE
|
||||||
bootstrap_stack_bottom:
|
bootstrap_stack_bottom:
|
||||||
.skip 0x1000
|
.skip 0x4000
|
||||||
bootstrap_stack_top:
|
bootstrap_stack_top:
|
||||||
|
|
||||||
/*******
|
/*******
|
||||||
@@ -260,7 +260,8 @@ long_mode_switch:
|
|||||||
_start:
|
_start:
|
||||||
mov $bootstrap_stack_top, %esp
|
mov $bootstrap_stack_top, %esp
|
||||||
|
|
||||||
push %ebx # store the pointer to the multiboot info block.
|
push %ebx # store the pointer to the multiboot info block as a 64-bit value.
|
||||||
|
push $0x00 # store the pointer to the multiboot info block as a 64-bit value.
|
||||||
|
|
||||||
# check if long mode is supported
|
# check if long mode is supported
|
||||||
movl $0x80000000, %eax # Extended-function 80000000h.
|
movl $0x80000000, %eax # Extended-function 80000000h.
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
.code64
|
.code64
|
||||||
|
|
||||||
|
.extern kernel_init # defined in core/main.c
|
||||||
|
|
||||||
.section .boot.rodata, "a", @progbits
|
.section .boot.rodata, "a", @progbits
|
||||||
|
|
||||||
/*******
|
/*******
|
||||||
@@ -63,7 +65,11 @@ print_kernel_identifier:
|
|||||||
.type start_64, @function
|
.type start_64, @function
|
||||||
start_64:
|
start_64:
|
||||||
call vga_clear
|
call vga_clear
|
||||||
|
|
||||||
|
pop %rax
|
||||||
call print_kernel_identifier
|
call print_kernel_identifier
|
||||||
|
|
||||||
|
call kernel_init
|
||||||
|
|
||||||
cli
|
cli
|
||||||
hlt
|
hlt
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
void kernel_init()
|
#include <stdint.h>
|
||||||
{
|
|
||||||
|
|
||||||
|
void kernel_init(uint64_t arg)
|
||||||
|
{
|
||||||
|
uint8_t *vga = (uint8_t *)0xb8000;
|
||||||
|
*vga = 'A';
|
||||||
|
*(vga + 1) = 0x0F;
|
||||||
}
|
}
|
||||||
|
|||||||
62
tools/kernel-debug/debug_session.py
Executable file
62
tools/kernel-debug/debug_session.py
Executable file
@@ -0,0 +1,62 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import time
|
||||||
|
import signal
|
||||||
|
|
||||||
|
|
||||||
|
qemu_args = []
|
||||||
|
gdb_args = []
|
||||||
|
cur_program = ''
|
||||||
|
|
||||||
|
|
||||||
|
def run_process(args):
|
||||||
|
p = subprocess.Popen(args,
|
||||||
|
bufsize=1,
|
||||||
|
shell=True,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.PIPE)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
retcode = p.poll()
|
||||||
|
line = p.stdout.read(1)
|
||||||
|
yield line
|
||||||
|
if retcode is not None:
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
for arg in sys.argv[1:]:
|
||||||
|
if arg == '--qemu':
|
||||||
|
cur_program = 'qemu'
|
||||||
|
continue
|
||||||
|
elif arg == '--gdb':
|
||||||
|
cur_program = 'gdb'
|
||||||
|
continue
|
||||||
|
|
||||||
|
if cur_program == 'qemu':
|
||||||
|
qemu_args += [arg]
|
||||||
|
elif cur_program == 'gdb':
|
||||||
|
gdb_args += [arg]
|
||||||
|
else:
|
||||||
|
print('No program specified')
|
||||||
|
exit(-1)
|
||||||
|
|
||||||
|
env = os.environ.copy()
|
||||||
|
signal.signal(signal.SIGINT, signal.SIG_IGN)
|
||||||
|
qemu = subprocess.Popen(qemu_args,
|
||||||
|
env=env,
|
||||||
|
start_new_session=True,
|
||||||
|
restore_signals=False)
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
if qemu.poll() is not None:
|
||||||
|
print('Failed to start QEMU')
|
||||||
|
exit(-1)
|
||||||
|
|
||||||
|
subprocess.run(gdb_args,
|
||||||
|
env=env,
|
||||||
|
stdout=sys.stdout,
|
||||||
|
stdin=sys.stdin,
|
||||||
|
stderr=sys.stderr)
|
||||||
|
qemu.kill()
|
||||||
26
tools/kernel-debug/debug_session.sh
Executable file
26
tools/kernel-debug/debug_session.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
gdb_cfg=$1
|
||||||
|
lldb_cfg=$2
|
||||||
|
shift 2
|
||||||
|
|
||||||
|
if command -v gdb &> /dev/null; then
|
||||||
|
tmux \
|
||||||
|
new-session -d -s hz-debug "sleep 0.3; gdb -tui -x $gdb_cfg" \; \
|
||||||
|
split-window -h -l 80 \; \
|
||||||
|
split-window -v -l 25 "$@"\; \
|
||||||
|
select-pane -t 0
|
||||||
|
elif command -v lldb &> /dev/null; then
|
||||||
|
tmux \
|
||||||
|
new-session -d -s hz-debug "sleep 0.1; lldb --source $lldb_cfg" \; \
|
||||||
|
split-window -h -l 80 \; \
|
||||||
|
split-window -v -l 25 "$@"\; \
|
||||||
|
select-pane -t 0
|
||||||
|
else
|
||||||
|
echo "No debugger available"
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
|
||||||
|
tmux a -t hz-debug
|
||||||
|
tmux kill-session -t hz-debug
|
||||||
|
|
||||||
4
tools/kernel-debug/gdb_session_init
Normal file
4
tools/kernel-debug/gdb_session_init
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
set confirm off
|
||||||
|
symbol-file build/socks_kernel
|
||||||
|
target remote localhost:1234
|
||||||
|
set confirm on
|
||||||
2
tools/kernel-debug/lldb_session_init
Normal file
2
tools/kernel-debug/lldb_session_init
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
file build/socks_kernel
|
||||||
|
gdb-remote localhost:1234
|
||||||
@@ -2,7 +2,7 @@ LD := $(ARCH)-elf-gcc
|
|||||||
CC := $(ARCH)-elf-gcc
|
CC := $(ARCH)-elf-gcc
|
||||||
ASM := $(ARCH)-elf-gcc
|
ASM := $(ARCH)-elf-gcc
|
||||||
|
|
||||||
CFLAGS := -nostdlib -nostdinc -ffreestanding -Wl,-nostdlib
|
CFLAGS := -ffreestanding -nostdlib
|
||||||
ASMFLAGS := $(CFLAGS)
|
ASMFLAGS := $(CFLAGS)
|
||||||
LDFLAGS := -nostdlib
|
LDFLAGS := -nostdlib
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user