--- np2/i386c/ia32/segments.c 2003/12/08 00:55:31 1.1 +++ np2/i386c/ia32/segments.c 2004/01/14 16:14:49 1.5 @@ -1,4 +1,4 @@ -/* $Id: segments.c,v 1.1 2003/12/08 00:55:31 yui Exp $ */ +/* $Id: segments.c,v 1.5 2004/01/14 16:14:49 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 */ @@ -187,6 +185,19 @@ load_ldtr(WORD selector, int exc) EXCEPTION((exc == TS_EXCEPTION) ? TS_EXCEPTION : NP_EXCEPTION, sel.selector); } +#if defined(DEBUG) +{ + DWORD v[2]; + DWORD i; + + for (i = 0; i < sel.desc.u.seg.limit; i += 8) { + v[0] = cpu_lmemoryread_d(sel.desc.u.seg.segbase + i); + v[1] = cpu_lmemoryread_d(sel.desc.u.seg.segbase + i + 4); + VERBOSE(("load_ldtr: %08x: %08x%08x", sel.desc.u.seg.segbase + i, v[0], v[1])); + } +} +#endif + CPU_LDTR = sel.selector; CPU_LDTR_DESC = sel.desc; } @@ -234,6 +245,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;