Ring 3 ready

- Fixed issue with setting up the Task Segment Register
This commit is contained in:
2023-02-13 22:44:47 +01:00
parent 1f90a5d862
commit c9a036bfbb
5 changed files with 38 additions and 31 deletions

View File

@ -34,26 +34,27 @@ struct TaskStateSegment {
}__attribute__((packed));
TaskStateSegment tss0 = {};
TaskStateSegment tss0 ={};
inline void flush_tss(){
asm volatile("mov (5 * 8) |0 , %eax; ltr %ax");
inline void flush_tss()
{
asm volatile("mov $0x2B, %ax ; ltr %ax");
}
void setup_tss(){
// ensure the tss is zero'd
//memset((void*)&tss0, 0, sizeof(tss0));
tss0.ss0 = (uint32_t) &(GlobalDescriptorTable[KERNEL_DATA_SEGMENT]);
uint32_t esp_addr =0 ;
asm volatile ("movl %%esp, %0" : "=a"(esp_addr));
tss0.esp0 = esp_addr;
memset((void*)&tss0, 0, sizeof(tss0));
tss0.ss0 = (uint32_t) &GlobalDescriptorTable[KERNEL_DATA_SEGMENT];
extern uint32_t stack_top;
tss0.esp0 = (unsigned long)&stack_top;
// Task Segment Descriptor
add_descriptor(TASK_STATE_SEGMENT, (unsigned long)&tss0, sizeof(tss0), 0x89, 0x0);
flush_tss();
uint32_t address = (unsigned long) &tss0;
uint32_t size = sizeof(tss0);
uint32_t limit = (address + size );
add_descriptor(TASK_STATE_SEGMENT, address, limit- 1, 0xE9, 0x0);
}