|
|
| version 1.30, 2011/12/29 13:32:12 | version 1.31, 2011/12/29 14:30:31 |
|---|---|
| Line 490 task_switch(selector_t *task_sel, task_s | Line 490 task_switch(selector_t *task_sel, task_s |
| /* set new segment register */ | /* set new segment register */ |
| if (!CPU_STAT_VM86) { | if (!CPU_STAT_VM86) { |
| /* load CS */ | |
| rv = parse_selector(&cs_sel, sreg[CPU_CS_INDEX]); | |
| if (rv < 0) { | |
| VERBOSE(("task_switch: load CS failure (sel = 0x%04x, rv = %d)", sreg[CPU_CS_INDEX], rv)); | |
| EXCEPTION(TS_EXCEPTION, cs_sel.idx); | |
| } | |
| /* CS must be code segment */ | |
| if (SEG_IS_SYSTEM(&cs_sel.desc) || SEG_IS_DATA(&cs_sel.desc)) { | |
| EXCEPTION(TS_EXCEPTION, cs_sel.idx); | |
| } | |
| /* check privilege level */ | |
| if (!SEG_IS_CONFORMING_CODE(&cs_sel.desc)) { | |
| /* non-confirming code segment */ | |
| if (cs_sel.desc.dpl != cs_sel.rpl) { | |
| EXCEPTION(TS_EXCEPTION, cs_sel.idx); | |
| } | |
| } else { | |
| /* conforming code segment */ | |
| if (cs_sel.desc.dpl > cs_sel.rpl) { | |
| EXCEPTION(TS_EXCEPTION, cs_sel.idx); | |
| } | |
| } | |
| /* code segment is not present */ | |
| rv = selector_is_not_present(&cs_sel); | |
| if (rv < 0) { | |
| EXCEPTION(NP_EXCEPTION, cs_sel.idx); | |
| } | |
| /* load SS */ | /* load SS */ |
| rv = parse_selector(&ss_sel, sreg[CPU_SS_INDEX]); | rv = parse_selector(&ss_sel, sreg[CPU_SS_INDEX]); |
| if (rv < 0) { | if (rv < 0) { |
| Line 525 task_switch(selector_t *task_sel, task_s | Line 556 task_switch(selector_t *task_sel, task_s |
| LOAD_SEGREG1(CPU_FS_INDEX, sreg[CPU_FS_INDEX], TS_EXCEPTION); | LOAD_SEGREG1(CPU_FS_INDEX, sreg[CPU_FS_INDEX], TS_EXCEPTION); |
| LOAD_SEGREG1(CPU_GS_INDEX, sreg[CPU_GS_INDEX], TS_EXCEPTION); | LOAD_SEGREG1(CPU_GS_INDEX, sreg[CPU_GS_INDEX], TS_EXCEPTION); |
| /* load CS */ | |
| rv = parse_selector(&cs_sel, sreg[CPU_CS_INDEX]); | |
| if (rv < 0) { | |
| VERBOSE(("task_switch: load CS failure (sel = 0x%04x, rv = %d)", sreg[CPU_CS_INDEX], rv)); | |
| EXCEPTION(TS_EXCEPTION, cs_sel.idx); | |
| } | |
| /* CS must be code segment */ | |
| if (SEG_IS_SYSTEM(&cs_sel.desc) || SEG_IS_DATA(&cs_sel.desc)) { | |
| EXCEPTION(TS_EXCEPTION, cs_sel.idx); | |
| } | |
| /* check privilege level */ | |
| if (!SEG_IS_CONFORMING_CODE(&cs_sel.desc)) { | |
| /* non-confirming code segment */ | |
| if (cs_sel.desc.dpl != cs_sel.rpl) { | |
| EXCEPTION(TS_EXCEPTION, cs_sel.idx); | |
| } | |
| } else { | |
| /* conforming code segment */ | |
| if (cs_sel.desc.dpl > cs_sel.rpl) { | |
| EXCEPTION(TS_EXCEPTION, cs_sel.idx); | |
| } | |
| } | |
| /* code segment is not present */ | |
| rv = selector_is_not_present(&cs_sel); | |
| if (rv < 0) { | |
| EXCEPTION(NP_EXCEPTION, cs_sel.idx); | |
| } | |
| /* Now loading CS register */ | /* Now loading CS register */ |
| load_cs(cs_sel.selector, &cs_sel.desc, cs_sel.rpl); | load_cs(cs_sel.selector, &cs_sel.desc, cs_sel.rpl); |
| } | } |