Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 21 additions & 54 deletions src/kernel/cpu/gdt.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <gdt.h>
#include <stdint.h>
#include <util.h>

// GDT & TSS Entry configurator
Expand All @@ -10,6 +11,17 @@ static TSSPtr tss;

TSSPtr *tssPtr = &tss;

void gdt_set_entry(int idx, uint32_t base, uint32_t limit, uint8_t access,
uint8_t granularity) {
gdt.descriptors[idx].base_low = (base & 0xffff);
gdt.descriptors[idx].base_mid = (base >> 16) & 0xff;
gdt.descriptors[idx].access = access;
gdt.descriptors[idx].granularity =
((limit >> 16) & 0x0f) | (granularity & 0xf0);
gdt.descriptors[idx].base_high = (base >> 24) & 0xff;
gdt.descriptors[idx].limit = limit;
}

void gdt_load_tss(TSSPtr *tss) {
size_t addr = (size_t)tss;

Expand Down Expand Up @@ -44,80 +56,35 @@ void gdt_reload() {

void initiateGDT() {
// Null descriptor. (0)
gdt.descriptors[0].limit = 0;
gdt.descriptors[0].base_low = 0;
gdt.descriptors[0].base_mid = 0;
gdt.descriptors[0].access = 0;
gdt.descriptors[0].granularity = 0;
gdt.descriptors[0].base_high = 0;
gdt_set_entry(0, 0, 0, 0, 0);

// Kernel code 16. (8)
gdt.descriptors[1].limit = 0xffff;
gdt.descriptors[1].base_low = 0;
gdt.descriptors[1].base_mid = 0;
gdt.descriptors[1].access = 0b10011010;
gdt.descriptors[1].granularity = 0b00000000;
gdt.descriptors[1].base_high = 0;
gdt_set_entry(1, 0, 0xffff, 0b10011010, 0);

// Kernel data 16. (16)
gdt.descriptors[2].limit = 0xffff;
gdt.descriptors[2].base_low = 0;
gdt.descriptors[2].base_mid = 0;
gdt.descriptors[2].access = 0b10010010;
gdt.descriptors[2].granularity = 0b00000000;
gdt.descriptors[2].base_high = 0;
gdt_set_entry(2, 0, 0xffff, 0b10010010, 0);

// Kernel code 32. (24)
gdt.descriptors[3].limit = 0xffff;
gdt.descriptors[3].base_low = 0;
gdt.descriptors[3].base_mid = 0;
gdt.descriptors[3].access = 0b10011010;
gdt.descriptors[3].granularity = 0b11001111;
gdt.descriptors[3].base_high = 0;
gdt_set_entry(3, 0, 0xffff, 0b10011010, 0b11001111);

// Kernel data 32. (32)
gdt.descriptors[4].limit = 0xffff;
gdt.descriptors[4].base_low = 0;
gdt.descriptors[4].base_mid = 0;
gdt.descriptors[4].access = 0b10010010;
gdt.descriptors[4].granularity = 0b11001111;
gdt.descriptors[4].base_high = 0;
gdt_set_entry(4, 0, 0xffff, 0b10010010, 0b11001111);

// Kernel code 64. (40)
gdt.descriptors[5].limit = 0;
gdt.descriptors[5].base_low = 0;
gdt.descriptors[5].base_mid = 0;
gdt.descriptors[5].access = 0b10011010;
gdt.descriptors[5].granularity = 0b00100000;
gdt.descriptors[5].base_high = 0;
gdt_set_entry(5, 0, 0, 0b10011010, 0b00100000);

// Kernel data 64. (48)
gdt.descriptors[6].limit = 0;
gdt.descriptors[6].base_low = 0;
gdt.descriptors[6].base_mid = 0;
gdt.descriptors[6].access = 0b10010010;
gdt.descriptors[6].granularity = 0;
gdt.descriptors[6].base_high = 0;
gdt_set_entry(6, 0, 0, 0b10010010, 0);

// SYSENTER
gdt.descriptors[7] = (GDTEntry){0}; // (56)
gdt.descriptors[8] = (GDTEntry){0}; // (64)

// User code 64. (72)
gdt.descriptors[10].limit = 0;
gdt.descriptors[10].base_low = 0;
gdt.descriptors[10].base_mid = 0;
gdt.descriptors[10].access = 0b11111010;
gdt.descriptors[10].granularity = 0b00100000;
gdt.descriptors[10].base_high = 0;
gdt_set_entry(10, 0, 0, 0b11111010, 0b00100000);

// User data 64. (80)
gdt.descriptors[9].limit = 0;
gdt.descriptors[9].base_low = 0;
gdt.descriptors[9].base_mid = 0;
gdt.descriptors[9].access = 0b11110010;
gdt.descriptors[9].granularity = 0;
gdt.descriptors[9].base_high = 0;
gdt_set_entry(9, 0, 0, 0b11110010, 0);

// TSS. (88)
gdt.tss.length = 104;
Expand Down
122 changes: 46 additions & 76 deletions src/kernel/cpu/isr.asm
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,46 @@

bits 64


; macro for pushing all registers (since pusha doesn't exist for 64 bit regs)
%macro pusha64 0
push rax
push rbx
push rcx
push rdx
push rsi
push rdi
push rbp
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
%endmacro

; macro for popping all registers (since popa doesn't exist for 64 bit regs)
%macro popa64 0
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
pop rax
%endmacro


global asm_finalize
asm_finalize:
; rdi = switch stack pointer
Expand All @@ -15,21 +55,7 @@ asm_finalize:
; mov ds, ebp
mov es, ebp

pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
pop rax
popa64

add rsp, 16 ; pop error code and interrupt number
iretq ; pops (CS, EIP, EFLAGS) and also (SS, ESP) if privilege change occurs
Expand All @@ -55,21 +81,7 @@ syscall_entry:
push qword 0 ; error
push qword 0 ; interrupt

push rax
push rbx
push rcx
push rdx
push rsi
push rdi
push rbp
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
pusha64

mov rbp, ds
push rbp
Expand All @@ -83,21 +95,7 @@ syscall_entry:
mov ds, ebp
mov es, ebp

pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
pop rax
popa64

add rsp, 16 ; pop error code and interrupt number
add rsp, 40 ; pop other interrupt stuff
Expand All @@ -107,21 +105,7 @@ syscall_entry:
o64 sysret

isr_common:
push rax
push rbx
push rcx
push rdx
push rsi
push rdi
push rbp
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
pusha64

mov rbp, ds
push rbp
Expand All @@ -143,21 +127,7 @@ asm_isr_exit:
; mov ds, ebp
mov es, ebp

pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
pop rax
popa64

add rsp, 16 ; pop error code and interrupt number
iretq ; pops (CS, EIP, EFLAGS) and also (SS, ESP) if privilege change occurs
Expand Down Expand Up @@ -249,4 +219,4 @@ asm_isr_redirect_table:
%rep 48
dq isr%+i
%assign i i+1
%endrep
%endrep
8 changes: 4 additions & 4 deletions tools/kernel/make_disk.sh
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ SIZE_IN_BLOCKS=$((($SIZE_IN_BYTES / 512) * 2 + 500000))

if [ -z "$4" ]; then
dd if=/dev/zero of="${3}" bs=512 count=$SIZE_IN_BLOCKS
parted "${3}" mklabel msdos
parted "${3}" mkpart primary ext4 2048s 68157440B
parted "${3}" set 1 boot on
parted "${3}" mkpart primary ext4 136314880B 100%
sudo parted "${3}" mklabel msdos
sudo parted "${3}" mkpart primary ext4 2048s 68157440B
sudo parted "${3}" set 1 boot on
sudo parted "${3}" mkpart primary ext4 136314880B 100%
"$LIMINE_EXEC" bios-install "${3}"
fi

Expand Down