Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}