--- np2/i386c/ia32/segments.c 2003/12/08 00:55:31 1.1 +++ np2/i386c/ia32/segments.c 2004/01/13 16:36:00 1.4 @@ -1,4 +1,4 @@ -/* $Id: segments.c,v 1.1 2003/12/08 00:55:31 yui Exp $ */ +/* $Id: segments.c,v 1.4 2004/01/13 16:36:00 monaka Exp $ */ /* * Copyright (c) 2003 NONAKA Kimihiro @@ -38,10 +38,7 @@ load_segreg(int idx, WORD selector, int selector_t sel; int rv; - - if ((unsigned int)idx >= CPU_SEGREG_NUM) { - ia32_panic("load_segreg: sreg(%d)", idx); - } + __ASSERT((unsigned int)idx < CPU_SEGREG_NUM); if (!CPU_STAT_PM || CPU_STAT_VM86) { descriptor_t sd; @@ -145,7 +142,8 @@ void load_cs(WORD selector, descriptor_t* sdp, BYTE cpl) { - cpu_inst_default.op_32 = cpu_inst_default.as_32 = sdp->d; + CPU_STATSAVE.cpu_inst_default.op_32 + = CPU_STATSAVE.cpu_inst_default.as_32 = sdp->d; CPU_REGS_SREG(CPU_CS_INDEX) = (selector & ~3) | (cpl & 3); CPU_STAT_SREG(CPU_CS_INDEX) = *sdp; CPU_STAT_CPL = cpl & 3; @@ -172,13 +170,13 @@ load_ldtr(WORD selector, int exc) } /* check descriptor type */ - if (!sel.desc.s || (sel.desc.type != CPU_SYSDESC_TYPE_LDT)) { + if (sel.desc.s || (sel.desc.type != CPU_SYSDESC_TYPE_LDT)) { EXCEPTION(exc, sel.selector); } /* check limit */ if (sel.desc.u.seg.limit < 7) { - ia32_panic("load_ldtr: LDTR descriptor limit < 7"); + ia32_panic("load_ldtr: LDTR descriptor limit < 7 (limit = %d)", sel.desc.u.seg.limit); } /* not present */ @@ -234,6 +232,11 @@ load_descriptor(descriptor_t *descp, DWO switch (descp->type) { case CPU_SYSDESC_TYPE_LDT: /* LDT */ descp->valid = 1; + descp->u.seg.segbase = descp->h & 0xff000000; + descp->u.seg.segbase |= (descp->h & 0xff) << 16; + descp->u.seg.segbase |= descp->l >> 16; + descp->u.seg.limit = descp->h & 0xf0000; + descp->u.seg.limit |= descp->l & 0xffff; VERBOSE(("load_descriptor: LDT descriptor")); break;