mirror of
https://github.com/tailix/kernel.git
synced 2025-09-04 22:42:59 -04:00
Set task state segment
This commit is contained in:
parent
adcb66761b
commit
a7cdcecbdc
5 changed files with 102 additions and 1 deletions
|
@ -18,6 +18,8 @@ OBJS += kprintf.c.o
|
||||||
|
|
||||||
OBJS += protected.c.o protected.asm.cpp.o
|
OBJS += protected.c.o protected.asm.cpp.o
|
||||||
|
|
||||||
|
OBJS += tss.c.o
|
||||||
|
|
||||||
OBJS += interrupt.asm.cpp.o
|
OBJS += interrupt.asm.cpp.o
|
||||||
|
|
||||||
OBJS += exception.c.o
|
OBJS += exception.c.o
|
||||||
|
|
|
@ -16,7 +16,8 @@
|
||||||
#define GDT_KERNEL_DS_INDEX 2
|
#define GDT_KERNEL_DS_INDEX 2
|
||||||
#define GDT_USER_CS_INDEX 3
|
#define GDT_USER_CS_INDEX 3
|
||||||
#define GDT_USER_DS_INDEX 4
|
#define GDT_USER_DS_INDEX 4
|
||||||
#define GDT_SIZE 5
|
#define GDT_TSS_INDEX 5
|
||||||
|
#define GDT_SIZE 6
|
||||||
|
|
||||||
#define GDT_DESCRIPTOR_SIZE 8 // bytes
|
#define GDT_DESCRIPTOR_SIZE 8 // bytes
|
||||||
|
|
||||||
|
@ -27,6 +28,7 @@
|
||||||
#define GDT_KERNEL_DS_SELECTOR GDT_SEGMENT_SELECTOR(GDT_KERNEL_DS_INDEX)
|
#define GDT_KERNEL_DS_SELECTOR GDT_SEGMENT_SELECTOR(GDT_KERNEL_DS_INDEX)
|
||||||
#define GDT_USER_CS_SELECTOR GDT_SEGMENT_SELECTOR(GDT_USER_CS_INDEX)
|
#define GDT_USER_CS_SELECTOR GDT_SEGMENT_SELECTOR(GDT_USER_CS_INDEX)
|
||||||
#define GDT_USER_DS_SELECTOR GDT_SEGMENT_SELECTOR(GDT_USER_DS_INDEX)
|
#define GDT_USER_DS_SELECTOR GDT_SEGMENT_SELECTOR(GDT_USER_DS_INDEX)
|
||||||
|
#define GDT_TSS_SELECTOR GDT_SEGMENT_SELECTOR(GDT_TSS_INDEX)
|
||||||
|
|
||||||
#define INT_EXCEPTION_COUNT 32
|
#define INT_EXCEPTION_COUNT 32
|
||||||
#define INT_HWINT_COUNT 16
|
#define INT_HWINT_COUNT 16
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "asm.h"
|
#include "asm.h"
|
||||||
#include "interrupt.h"
|
#include "interrupt.h"
|
||||||
#include "hwint.h"
|
#include "hwint.h"
|
||||||
|
#include "tss.h"
|
||||||
|
|
||||||
#include <kernelmq/stdlib.h>
|
#include <kernelmq/stdlib.h>
|
||||||
|
|
||||||
|
@ -75,6 +76,8 @@ void protected_initialize()
|
||||||
gdt_set_gate(GDT_USER_CS_INDEX, 0, 0xFFFFFFFF, 0xFA, 0xCF);
|
gdt_set_gate(GDT_USER_CS_INDEX, 0, 0xFFFFFFFF, 0xFA, 0xCF);
|
||||||
gdt_set_gate(GDT_USER_DS_INDEX, 0, 0xFFFFFFFF, 0xF2, 0xCF);
|
gdt_set_gate(GDT_USER_DS_INDEX, 0, 0xFFFFFFFF, 0xF2, 0xCF);
|
||||||
|
|
||||||
|
tss_write_to_gdt(&gdt_entries[GDT_TSS_INDEX]);
|
||||||
|
|
||||||
logger_info("Setup IDT.");
|
logger_info("Setup IDT.");
|
||||||
|
|
||||||
kmemset(idt_entries, 0, sizeof(idt_entries));
|
kmemset(idt_entries, 0, sizeof(idt_entries));
|
||||||
|
|
88
arch/tss.c
Normal file
88
arch/tss.c
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
#include "tss.h"
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <kernelmq/stdlib.h>
|
||||||
|
|
||||||
|
struct gdt_entry_bits {
|
||||||
|
unsigned int limit_low : 16;
|
||||||
|
unsigned int base_low : 24;
|
||||||
|
unsigned int accessed : 1;
|
||||||
|
unsigned int read_write : 1;
|
||||||
|
unsigned int conforming_expand_down : 1;
|
||||||
|
unsigned int code : 1;
|
||||||
|
unsigned int always_1 : 1;
|
||||||
|
unsigned int DPL : 2;
|
||||||
|
unsigned int present : 1;
|
||||||
|
unsigned int limit_high : 4;
|
||||||
|
unsigned int available : 1;
|
||||||
|
unsigned int always_0 : 1;
|
||||||
|
unsigned int big : 1;
|
||||||
|
unsigned int gran : 1;
|
||||||
|
unsigned int base_high : 8;
|
||||||
|
}
|
||||||
|
__attribute__((packed));
|
||||||
|
|
||||||
|
struct tss_entry {
|
||||||
|
unsigned int prev_tss;
|
||||||
|
unsigned int esp0;
|
||||||
|
unsigned int ss0;
|
||||||
|
unsigned int esp1;
|
||||||
|
unsigned int ss1;
|
||||||
|
unsigned int esp2;
|
||||||
|
unsigned int ss2;
|
||||||
|
unsigned int cr3;
|
||||||
|
unsigned int eip;
|
||||||
|
unsigned int eflags;
|
||||||
|
unsigned int eax;
|
||||||
|
unsigned int ecx;
|
||||||
|
unsigned int edx;
|
||||||
|
unsigned int ebx;
|
||||||
|
unsigned int esp;
|
||||||
|
unsigned int ebp;
|
||||||
|
unsigned int esi;
|
||||||
|
unsigned int edi;
|
||||||
|
unsigned int es;
|
||||||
|
unsigned int cs;
|
||||||
|
unsigned int ss;
|
||||||
|
unsigned int ds;
|
||||||
|
unsigned int fs;
|
||||||
|
unsigned int gs;
|
||||||
|
unsigned int ldt;
|
||||||
|
unsigned short trap;
|
||||||
|
unsigned short iomap_base;
|
||||||
|
}
|
||||||
|
__attribute__((packed));
|
||||||
|
|
||||||
|
static struct tss_entry tss;
|
||||||
|
|
||||||
|
void tss_write_to_gdt(void *gdt_entry_ptr)
|
||||||
|
{
|
||||||
|
struct gdt_entry_bits *const g = gdt_entry_ptr;
|
||||||
|
|
||||||
|
unsigned long base = (unsigned long)&tss;
|
||||||
|
unsigned long limit = sizeof(tss);
|
||||||
|
|
||||||
|
g->limit_low = limit & 0xFFFF;
|
||||||
|
g->base_low = base & 0xFFFFFF;
|
||||||
|
|
||||||
|
g->base_high = (base & 0xFF000000) >> 24;
|
||||||
|
g->limit_high = (limit & 0xF0000) >> 16;
|
||||||
|
|
||||||
|
g->accessed = 1;
|
||||||
|
g->read_write = 0;
|
||||||
|
g->conforming_expand_down = 0;
|
||||||
|
g->code = 1;
|
||||||
|
g->always_1 = 0;
|
||||||
|
g->DPL = 3;
|
||||||
|
g->present = 1;
|
||||||
|
g->available = 0;
|
||||||
|
g->always_0 = 0;
|
||||||
|
g->big = 0;
|
||||||
|
g->gran = 0;
|
||||||
|
|
||||||
|
kmemset(&tss, 0, sizeof(tss));
|
||||||
|
|
||||||
|
tss.ss0 = GDT_KERNEL_DS_SELECTOR;
|
||||||
|
tss.esp0 = 0; // TODO: get from kinfo
|
||||||
|
}
|
6
arch/tss.h
Normal file
6
arch/tss.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#ifndef KERNELMQ_INCLUDED_TSS
|
||||||
|
#define KERNELMQ_INCLUDED_TSS 1
|
||||||
|
|
||||||
|
void tss_write_to_gdt(void *gdt_entry);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Add table
Add a link
Reference in a new issue