--- np2/i386c/ia32/segments.c 2003/12/11 14:59:42 1.2 +++ np2/i386c/ia32/segments.c 2004/01/14 16:14:49 1.5 @@ -1,4 +1,4 @@ -/* $Id: segments.c,v 1.2 2003/12/11 14:59:42 monaka Exp $ */ +/* $Id: segments.c,v 1.5 2004/01/14 16:14:49 monaka Exp $ */ /* * Copyright (c) 2003 NONAKA Kimihiro @@ -142,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; @@ -175,7 +176,7 @@ load_ldtr(WORD selector, int exc) /* 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 */ @@ -184,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; } @@ -231,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;