From 180c1254e665464059637d35719a96b935666a16 Mon Sep 17 00:00:00 2001 From: d0p1 Date: Fri, 12 Jul 2024 08:58:25 +0200 Subject: [PATCH] chore: sync repo --- kernel/init.inc | 29 --------- kernel/kernel.asm | 6 +- kernel/klog.inc | 12 ++++ kernel/lock.inc | 10 ++- kernel/sys/cpu.inc | 159 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 185 insertions(+), 31 deletions(-) delete mode 100644 kernel/init.inc create mode 100644 kernel/sys/cpu.inc diff --git a/kernel/init.inc b/kernel/init.inc deleted file mode 100644 index d1731d4..0000000 --- a/kernel/init.inc +++ /dev/null @@ -1,29 +0,0 @@ -struc TSS { - .prev_tss dd ? - .esp0 dd ? - .ss0 dd ? - .esp1 dd ? - .ss1 dd ? - .esp2 dd ? - .ss2 dd ? - .cr3 dd ? - .eip dd ? - .eflags dd ? - .eax dd ? - .ecx dd ? - .edx dd ? - .ebx dd ? - .esp dd ? - .ebp dd ? - .esi dd ? - .edi dd ? - .es dd ? - .cs dd ? - .ss dd ? - .ds dd ? - .fs dd ? - .gs dd ? - .ldt dd ? - .trap dw ? - .iomap dw ? -} diff --git a/kernel/kernel.asm b/kernel/kernel.asm index 99690a9..2d6cc42 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -52,7 +52,10 @@ kmain: add ebx, KERNEL_VIRT_BASE call pmm_free_range - ; idt, gdt + ; load kernel gdt + lgdt [pGDT] + ; I don't think i need to reload segment cuz their value are already correct + .halt: @@ -69,6 +72,7 @@ kmain: include 'dev/vga_console.inc' include 'mm/mm.inc' include 'lock.inc' + include 'gdt.inc' szMsgKernelAlive db "Kernel is alive", 0 szErrorBootProtocol db "Error: wrong magic number", 0 diff --git a/kernel/klog.inc b/kernel/klog.inc index 006c2f1..f5dd9dc 100644 --- a/kernel/klog.inc +++ b/kernel/klog.inc @@ -10,6 +10,18 @@ CMOS_REG_HOUR = 0x04 COM1 = 0x3F8 +;klog_kputc: +; mov dx, COM1 + 5 +; push eax +;@@: +; in al, dx +; and al, 0x20 +; jnz @b +; pop eax +; mov dx, COM1 +; out dx, al +; ret + ;; Function: klog_print ;; ;; In: diff --git a/kernel/lock.inc b/kernel/lock.inc index fdd7b30..d558c02 100644 --- a/kernel/lock.inc +++ b/kernel/lock.inc @@ -1,5 +1,9 @@ + ;; File: lock.inc - ;; + ;; Function: lock_acquire + ;; + ;; In: + ;; EAX - lock address lock_acquire: mov edx, 1 xchg edx, [eax] @@ -7,6 +11,10 @@ lock_acquire: jnz lock_acquire ret + ;; Function: lock_release + ;; + ;; In: + ;; EAX - lock address lock_release: xor edx, edx xchg [eax], edx diff --git a/kernel/sys/cpu.inc b/kernel/sys/cpu.inc new file mode 100644 index 0000000..5e25e8c --- /dev/null +++ b/kernel/sys/cpu.inc @@ -0,0 +1,159 @@ + ;; File: cpu.inc + + + ;; Structure: tss + ;; + ;; > 31 23 15 7 0 + ;; > +----------|----------+----------|----------+ + ;; > 0x64 | I/O map base | 00000000 0000000T | + ;; > +----------|----------+----------|----------+ + ;; > 0x60 | 00000000 00000000 | LDT | + ;; > +----------|----------+----------|----------+ + ;; > 0x5c | 00000000 00000000 | GS | + ;; > +----------|----------+----------|----------+ + ;; > 0x58 | 00000000 00000000 | FS | + ;; > +----------|----------+----------|----------+ + ;; > 0x54 | 00000000 00000000 | DS | + ;; > +----------|----------+----------|----------+ + ;; > 0x50 | 00000000 00000000 | SS | + ;; > +----------|----------+----------|----------+ + ;; > 0x4C | 00000000 00000000 | CS | + ;; > +----------|----------+----------|----------+ + ;; > 0x48 | 00000000 00000000 | ES | + ;; > +----------|----------+----------|----------+ + ;; > 0x44 | EDI | + ;; > +----------|----------+----------|----------+ + ;; > 0x40 | ESI | + ;; > +----------|----------+----------|----------+ + ;; > 0x3C | EBP | + ;; > +----------|----------+----------|----------+ + ;; > 0x38 | ESP | + ;; > +----------|----------+----------|----------+ + ;; > 0x34 | EBX | + ;; > +----------|----------+----------|----------+ + ;; > 0x30 | EDX | + ;; > +----------|----------+----------|----------+ + ;; > 0x2C | ECX | + ;; > +----------|----------+----------|----------+ + ;; > 0x28 | EAX | + ;; > +----------|----------+----------|----------+ + ;; > 0x24 | EFLAGS | + ;; > +----------|----------+----------|----------+ + ;; > 0x20 | EIP | + ;; > +----------|----------+----------|----------+ + ;; > 0x1C | CR3 | + ;; > +----------|----------+----------|----------+ + ;; > 0x18 | 00000000 00000000 | SS2 | + ;; > +----------|----------+----------|----------+ + ;; > 0x14 | ESP2 | + ;; > +----------|----------+----------|----------+ + ;; > 0x10 | 00000000 00000000 | SS1 | + ;; > +----------|----------+----------|----------+ + ;; > 0x0C | ESP1 | + ;; > +----------|----------+----------|----------+ + ;; > 0x08 | 00000000 00000000 | SS0 | + ;; > +----------|----------+----------|----------+ + ;; > 0x04 | ESP0 | + ;; > +----------|----------+----------|----------+ + ;; > 0x00 | 00000000 00000000 | old TSS selector | + ;; > +----------|----------+----------|----------+ + +struc TSS { + .prev_tss dd ? + .esp0 dd ? + .ss0 dd ? + .esp1 dd ? + .ss1 dd ? + .esp2 dd ? + .ss2 dd ? + .cr3 dd ? + .eip dd ? + .eflags dd ? + .eax dd ? + .ecx dd ? + .edx dd ? + .ebx dd ? + .esp dd ? + .ebp dd ? + .esi dd ? + .edi dd ? + .es dd ? + .cs dd ? + .ss dd ? + .ds dd ? + .fs dd ? + .gs dd ? + .ldt dd ? + .trap dw ? + .iomap dw ? +} + + ;; Structure: idt_gate + ;; .offset_low - TODO + ;; .selector - TODO + ;; .zero - TODO + ;; .attributes - TODO + ;; .offset_high - TODO + ;; +struc idt_gate + .offset_low: resw 1 + .selector: resw 1 + .zero: resb 1 + .attributes: resb 1 + .offset_high: resw 1 +endstruc + + ;; About: Gates + ;; - Task Gate + ;; > 31 23 15 7 0 + ;; > +----------------|----------------+-----------------|-----------------+ + ;; > | (NOT USED) | P DPL 0 0 1 0 1 (NOT USED) | + ;; > +----------------|----------------+-----------------|-----------------+ + ;; > | SELECTOR | (NOT USED) | + ;; > +----------------|----------------+-----------------|-----------------+ + ;; + ;; - Interrupt Gate + ;; > 31 23 15 7 0 + ;; > +----------------|----------------+-----------------|-----------------+ + ;; > | OFFSET 31..16 | P DPL 0 1 1 1 0 0 0 0 0 0 0 0 0 | + ;; > +----------------|----------------+-----------------|-----------------+ + ;; > | SELECTOR | OFFSET 15..0 | + ;; > +--------------- |----------------+-----------------|-----------------+ + ;; + ;; - Trap Gate + ;; > 31 23 15 7 0 + ;; > +----------------|----------------+-----------------|-----------------+ + ;; > | OFFSET 31..16 | P DPL 0 1 1 1 1 0 0 0 0 0 0 0 0 | + ;; > +----------------|----------------+-----------------|-----------------+ + ;; > | SELECTOR | OFFSET 15..0 | + ;; > +--------------- |----------------+-----------------|-----------------+ + + +struc intframe + ;; registers + .edi: resd 1 + .esi: resd 1 + .ebp: resd 1 + .esp: resd 1 + .ebx: resd 1 + .edx: resd 1 + .ecx: resd 1 + .eax: resd 1 + + ;; + .gs: resd 1 + .fs: resd 1 + .es: resd 1 + .ds: resd 1 + .intno: resd 1 + + ;; by x86 hardware + .err: resd 1 + .eip: resd 1 + .cs: resd 1 + .eflags: resd 1 + + ;; crossring + .useresp: resd 1 + .ss: resd 1 +endstruc