|
|
| version 1.2, 2003/12/11 14:59:42 | version 1.5, 2004/01/14 16:14:49 |
|---|---|
| Line 142 void | Line 142 void |
| load_cs(WORD selector, descriptor_t* sdp, BYTE cpl) | 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_REGS_SREG(CPU_CS_INDEX) = (selector & ~3) | (cpl & 3); |
| CPU_STAT_SREG(CPU_CS_INDEX) = *sdp; | CPU_STAT_SREG(CPU_CS_INDEX) = *sdp; |
| CPU_STAT_CPL = cpl & 3; | CPU_STAT_CPL = cpl & 3; |
| Line 175 load_ldtr(WORD selector, int exc) | Line 176 load_ldtr(WORD selector, int exc) |
| /* check limit */ | /* check limit */ |
| if (sel.desc.u.seg.limit < 7) { | 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 */ | /* not present */ |
| Line 184 load_ldtr(WORD selector, int exc) | Line 185 load_ldtr(WORD selector, int exc) |
| EXCEPTION((exc == TS_EXCEPTION) ? TS_EXCEPTION : NP_EXCEPTION, sel.selector); | 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 = sel.selector; |
| CPU_LDTR_DESC = sel.desc; | CPU_LDTR_DESC = sel.desc; |
| } | } |
| Line 231 load_descriptor(descriptor_t *descp, DWO | Line 245 load_descriptor(descriptor_t *descp, DWO |
| switch (descp->type) { | switch (descp->type) { |
| case CPU_SYSDESC_TYPE_LDT: /* LDT */ | case CPU_SYSDESC_TYPE_LDT: /* LDT */ |
| descp->valid = 1; | 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")); | VERBOSE(("load_descriptor: LDT descriptor")); |
| break; | break; |