void vbeint10(void) { #if (SMP) long id = k_curcpu->id; #endif static int first = 1; uint64_t *gdt; struct m_farptr *farptr; if (first) { kmemcpy((void *)BOOTREALBASE, &realstart, (unsigned long)&realend - (unsigned long)&realstart); first = 0; } realint10(); #if (SMP) gdt = &kerngdt[id][0]; #else gdt = kerngdt; #endif farptr = &realgdtptr; farptr->lim = NGDT * sizeof(uint64_t) - 1; farptr->adr = (uint32_t)gdt; gdtinit(farptr); return; }
ASMLINK void seginit(long id) { struct m_cpu *cpu = &cputab[id]; uint64_t *gdt; #if (REENTRANTGDTINIT) struct m_farptr *farptr = &gdtptrtab[id]; #else struct m_farptr *farptr = &gdtptr; #endif /* set descriptors */ #if (SMP) gdt = &kerngdt[id][0]; #else gdt = kerngdt; #endif segsetdesc(&gdt[TEXTSEG], 0, NPAGEMAX - 1, SEGCODE); segsetdesc(&gdt[DATASEG], 0, NPAGEMAX - 1, SEGDATA); // segsetdesc(&gdt[STKSGEG], 0, NPAGEMAX - 1); // segsetdesc(&gdt[TSSSEG], &tsstab[id], sizeof(struct m_tss), SEGTSS); segsetdesc(&gdt[UTEXTSEG], 0, NPAGEMAX - 1, SEGCODE | SEGUSER); segsetdesc(&gdt[UDATASEG], 0, NPAGEMAX - 1, SEGDATA | SEGUSER); /* per-CPU data segment */ segsetdesc(&gdt[CPUSEG], &cpu->cpu, 4 * sizeof(void *) + sizeof(long), SEGCPU); #if (VBE) gdt[REALCODESEG] = UINT64_C(0x00009a000000ffff); gdt[REALDATASEG] = UINT64_C(0x000092000000ffff); #endif /* initialize segmentation */ farptr->lim = NGDT * sizeof(uint64_t) - 1; farptr->adr = (uint32_t)gdt; gdtinit(farptr); return; }
void vbeint10(struct realregs *regs) { static int first = 1; if (first) { kmemcpy((void *)KERNREALBASE, &realstart, (unsigned long)&realend - (unsigned long)&realstart); first = 0; } #if 0 kmemcpy((void *)(KERNREALSTK - sizeof(struct realregs)), regs, sizeof(struct realregs)); #endif realint10(); gdtinit(); return; }