/** * @file tss.h * @brief Task State Segment (TSS) definitions. * * The TSS is required by x86 for ring transitions. When a user-mode process * triggers an interrupt, the CPU loads the kernel stack pointer (SS0:ESP0) * from the TSS before pushing the interrupt frame. */ #ifndef TSS_H #define TSS_H #include /** * x86 Task State Segment structure. * Only SS0 and ESP0 are actively used for ring 3 -> ring 0 transitions. */ typedef struct tss_entry { uint32_t prev_tss; uint32_t esp0; /**< Kernel stack pointer (loaded on ring transition). */ uint32_t ss0; /**< Kernel stack segment (loaded on ring transition). */ uint32_t esp1; uint32_t ss1; uint32_t esp2; uint32_t ss2; uint32_t cr3; uint32_t eip; uint32_t eflags; uint32_t eax; uint32_t ecx; uint32_t edx; uint32_t ebx; uint32_t esp; uint32_t ebp; uint32_t esi; uint32_t edi; uint32_t es; uint32_t cs; uint32_t ss; uint32_t ds; uint32_t fs; uint32_t gs; uint32_t ldt; uint16_t trap; uint16_t iomap_base; } __attribute__((packed)) tss_entry_t; /** * Initialize the TSS and install it as GDT entry 5 (selector 0x28). * Must be called after init_gdt(). */ void init_tss(void); /** * Update the kernel stack pointer in the TSS. * Called during context switches to set the stack for the next process. * * @param esp0 The new kernel stack pointer. */ void tss_set_kernel_stack(uint32_t esp0); #endif /* TSS_H */