tss
struct tss tss;
struct tss double_fault_tss;
struct tss *tss = &gCPU[cpu].arch.tss;
frame->cs = tss->cs;
frame->es = tss->es;
frame->ds = tss->ds;
frame->fs = tss->fs;
frame->gs = tss->gs;
frame->ip = tss->eip;
frame->bp = tss->ebp;
frame->sp = tss->esp;
frame->ax = tss->eax;
frame->bx = tss->ebx;
frame->cx = tss->ecx;
frame->dx = tss->edx;
frame->si = tss->esi;
frame->di = tss->edi;
frame->flags = tss->eflags;
struct tss* tss = &gCPU[cpuNum].arch.double_fault_tss;
memset(tss, 0, sizeof(struct tss));
tss->sp0 = (addr_t)x86_get_double_fault_stack(cpuNum, &stackSize);
tss->sp0 += stackSize;
tss->ss0 = KERNEL_DATA_SELECTOR;
tss->cr3 = x86_read_cr3();
tss->eip = (uint32)&double_fault;
tss->es = KERNEL_DATA_SELECTOR;
tss->cs = KERNEL_CODE_SELECTOR;
tss->ss = KERNEL_DATA_SELECTOR;
tss->esp = tss->sp0;
tss->ds = KERNEL_DATA_SELECTOR;
tss->fs = KERNEL_DATA_SELECTOR;
tss->gs = (KERNEL_TLS_SEGMENT << 3);
tss->ldt_seg_selector = 0;
tss->io_map_base = sizeof(struct tss);
set_tss_descriptor(&gGDTs[cpuNum][DOUBLE_FAULT_TSS_SEGMENT], (addr_t)tss,
sizeof(struct tss));
memset(&gCPU[cpu].arch.tss, 0, sizeof(struct tss));
gCPU[cpu].arch.tss.ss0 = (KERNEL_DATA_SEGMENT << 3) | DPL_KERNEL;
gCPU[cpu].arch.tss.io_map_base = sizeof(struct tss);
set_tss_descriptor(&gdt[TSS_SEGMENT], (addr_t)&gCPU[cpu].arch.tss,
sizeof(struct tss));
GlobalDescriptorTable::SetTSS(unsigned cpu, const TSSDescriptor& tss)
fTable[index] = tss.GetLower();
fTable[index + 1] = tss.GetUpper();
memset(&gCPU[cpu].arch.tss, 0, sizeof(struct tss));
gCPU[cpu].arch.tss.io_map_base = sizeof(struct tss);
struct tss* tss = &gCPU[cpu].arch.tss;
tss->ist1 = (addr_t)x86_get_double_fault_stack(cpu, &stackSize);
tss->ist1 += stackSize;
TSSDescriptor(uintptr_t(&gCPU[cpu].arch.tss), sizeof(struct tss)));
const TSSDescriptor& tss);
get_cpu_struct()->arch.tss.sp0 = thread->kernel_stack_top;
cpuData->arch.tss.sp0 = to->kernel_stack_top;