still no debug symbols

This commit is contained in:
Jack Halford 2018-03-10 17:35:51 +01:00
parent 1f5a361870
commit bbe2b8b1e6
9 changed files with 57 additions and 28 deletions

View file

@ -10,8 +10,8 @@ endif
project := bluesnow project := bluesnow
arch ?= x86 arch ?= x86
NASM := nasm -f elf NASM := /usr/bin/nasm -f elf
LD := ld -m elf_i386 -L ./ -n --gc-sections LD := /usr/bin/ld -m elf_i386 -L ./ -n --gc-sections
# QEMU := qemu-system-x86_64 -device isa-debug-exit,iobase=0xf4,iosize=0x04 -gdb tcp::$(PORTG) -enable-kvm -monitor telnet:127.0.0.1:$(PORT),server,nowait # QEMU := qemu-system-x86_64 -device isa-debug-exit,iobase=0xf4,iosize=0x04 -gdb tcp::$(PORTG) -enable-kvm -monitor telnet:127.0.0.1:$(PORT),server,nowait
QEMU := qemu-system-x86_64 -gdb tcp::$(PORTG) -enable-kvm -monitor telnet:127.0.0.1:$(PORT),server,nowait QEMU := qemu-system-x86_64 -gdb tcp::$(PORTG) -enable-kvm -monitor telnet:127.0.0.1:$(PORT),server,nowait
@ -34,20 +34,19 @@ MONITOR := sleep 0.5;\
kill \`ps -x | grep \"[g]db\" | cut -d \ -f 1 \`;\ kill \`ps -x | grep \"[g]db\" | cut -d \ -f 1 \`;\
kill \`ps -x | grep \"[g]db\" | cut -d \ -f 2 \` kill \`ps -x | grep \"[g]db\" | cut -d \ -f 2 \`
GDB := gdb -q\ GDB := gdb -q\
-ex \"set arch i386:x64-32\"\ -ex \"set arch i386:x86-64\"\
-ex \"file $(kernel)\"\ -ex \"file $(kernel)\"\
-ex \"target remote localhost:$(PORTG)\" \ -ex \"target remote :$(PORTG)\"
-ex \"continue\" # -ex \"continue\"
all: $(kernel) all: $(kernel)
build/arch/$(arch)/%.o: src/arch/$(arch)/%.asm Makefile build/arch/$(arch)/%.o: src/arch/$(arch)/%.asm Makefile
@mkdir -p $(shell dirname $@) @mkdir -p $(shell dirname $@)
@$(NASM) $< -o $@ $(NASM) $< -o $@
@echo "Compiling (ASM) $@..."
$(kernel): $(rust_os) $(asm_object) $(linker_script) Makefile $(kernel): $(rust_os) $(asm_object) $(linker_script) Makefile
@$(LD) -o $@ -T $(linker_script) $(asm_object) $(rust_os) $(LD) -o $@ -T $(linker_script) $(asm_object) $(rust_os)
$(iso): $(kernel) $(grub.cfg) Makefile $(iso): $(kernel) $(grub.cfg) Makefile
@mkdir -p $(DIRISO)/boot/grub @mkdir -p $(DIRISO)/boot/grub
@ -71,7 +70,7 @@ R:
@tmux new-window 'tmux split-window -h "$(MONITOR)"; tmux split-window -fv "$(GDB)"; tmux select-pane -t 1; tmux resize-pane -x 80 -y 25; $(KERNEL_RUN)' @tmux new-window 'tmux split-window -h "$(MONITOR)"; tmux split-window -fv "$(GDB)"; tmux select-pane -t 1; tmux resize-pane -x 80 -y 25; $(KERNEL_RUN)'
clean: clean:
@cargo clean @xargo clean
@rm -r build @rm -r build
$(rust_os): $(target).json Makefile $(rust_os): $(target).json Makefile

View file

@ -12,9 +12,12 @@ start:
call check_multiboot call check_multiboot
call set_up_page_tables call set_up_page_tables
call enable_paging ; call enable_pse
; call enable_paging
; load the new gdt
lgdt [GDTR.ptr]
lgdt [GDTR.ptr] ; load the new gdt
jmp GDTR.gdt_cs:x86_start jmp GDTR.gdt_cs:x86_start
check_multiboot: check_multiboot:
@ -45,13 +48,22 @@ set_up_page_tables:
cmp ecx, 1023 ; if counter == 1023, the whole P2 table is mapped cmp ecx, 1023 ; if counter == 1023, the whole P2 table is mapped
jne .map_p2_table ; else map the next entry jne .map_p2_table ; else map the next entry
; load P2 to cr3 register (cpu uses this to access the P2 table) ret
mov eax, p2_table
mov cr3, eax ; PSE (Page Size Extension) allows huge pages to exist
enable_pse:
; enable PSE in the cr4 register
mov eax, cr4
or eax, 1 << 2
mov cr4, eax
ret ret
enable_paging: enable_paging:
; load P2 to cr3 register (cpu uses this to access the P2 table)
mov eax, p2_table
mov cr3, eax
; enable paging in the cr0 register ; enable paging in the cr0 register
mov eax, cr0 mov eax, cr0
or eax, 1 << 31 or eax, 1 << 31

View file

@ -13,7 +13,6 @@ x86_start:
call kmain call kmain
; if main return, loop forever ; that should NEVER append
cli ; clear interrupt cli ; clear interrupt
HALT: HALT:
hlt hlt

View file

@ -106,6 +106,6 @@ fn context() -> &'static mut Context {
pub fn init(multiboot_info_addr: usize) { pub fn init(multiboot_info_addr: usize) {
unsafe { CONTEXT = Some(Context::new(multiboot_info_addr)) }; unsafe { CONTEXT = Some(Context::new(multiboot_info_addr)) };
// memory::remap_the_kernel(frame_allocator(), boot_info()); memory::remap_the_kernel(frame_allocator(), boot_info());
self::init_screen(); self::init_screen();
} }

View file

@ -33,14 +33,24 @@ impl Mapper {
pub fn translate_page(&self, page: Page) -> Option<Frame> { pub fn translate_page(&self, page: Page) -> Option<Frame> {
// huge page handler, unimplemented let p1 = self.p2().next_table(page.p2_index());
let huge_page = || {
unimplemented!()
};
self.p2().next_table(page.p2_index()) let huge_page = || {
.and_then(|p1| p1[page.p1_index()].pointed_frame()) let p2_entry = &self.p2()[page.p2_index()];
.or_else(huge_page) if let Some(start_frame) = p2_entry.pointed_frame() {
if p2_entry.flags().contains(EntryFlags::HUGE_PAGE) {
// 2MiB alignment check
assert!(start_frame.number % ENTRY_COUNT == 0);
return Some(Frame {
number: start_frame.number + page.p1_index()
});
}
}
None
};
p1.and_then(|p1| p1[page.p1_index()].pointed_frame())
.or_else(huge_page)
} }

View file

@ -51,11 +51,12 @@ impl<L> Table<L> where L: HierarchicalLevel
where A: FrameAllocator where A: FrameAllocator
{ {
if self.next_table(index).is_none() { if self.next_table(index).is_none() {
// assert!(!self.entries[index].flags().contains(EntryFlags::HUGE_PAGE), assert!(!self[index].flags().contains(EntryFlags::HUGE_PAGE),
// "mapping code does not support huge pages"); "mapping code does not support huge pages");
let frame = allocator.allocate_frame().expect("no frames available"); let frame = allocator.allocate_frame().expect("no frames available");
self.entries[index].set(frame, EntryFlags::PRESENT | EntryFlags::WRITABLE); self[index].set(frame, EntryFlags::PRESENT | EntryFlags::WRITABLE);
self.next_table_mut(index).expect("no next next table 1").zero() panic!("wtf");
self.next_table_mut(index).expect("real wtf now").zero()
} }
self.next_table_mut(index).expect("no next table 2") self.next_table_mut(index).expect("no next table 2")
} }

View file

@ -5,6 +5,7 @@ pub use self::color::{Color, ColorCode};
use context; use context;
use cpuio; use cpuio;
use console; use console;
use x86;
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
#[repr(C)] #[repr(C)]
@ -164,7 +165,11 @@ impl Writer {
pub fn flush(&mut self) { pub fn flush(&mut self) {
let slice = unsafe { core::slice::from_raw_parts_mut(0xb8000 as *mut u8, 4000) }; let slice = unsafe { core::slice::from_raw_parts_mut(0xb8000 as *mut u8, 4000) };
let cr0 = x86::cr0() & !(1 << 31);
unsafe { x86::cr0_write(cr0); }
slice.as_mut().clone_from_slice(&self.buffer); slice.as_mut().clone_from_slice(&self.buffer);
unsafe { x86::cr0_write(cr0 | (1 << 31)); }
self.flush_cursor(); self.flush_cursor();
} }

View file

@ -1,5 +1,9 @@
//! x86 (32 bit) only //! x86 (32 bit) only
pub unsafe fn cr0_write(val: usize) {
asm!("mov $0, %cr0" :: "r"(val) : "memory");
}
pub fn cr0() -> usize { pub fn cr0() -> usize {
let ret: usize; let ret: usize;
unsafe { asm!("mov %cr0, $0" : "=r" (ret)) }; unsafe { asm!("mov %cr0, $0" : "=r" (ret)) };

View file

@ -1,6 +1,5 @@
{ {
"arch": "x86", "arch": "x86",
"cpu": "pentium4",
"data-layout": "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128", "data-layout": "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128",
"llvm-target": "i686-unknown-none", "llvm-target": "i686-unknown-none",
"linker-flavor": "gcc", "linker-flavor": "gcc",