|
|
| version 1.24, 2011/01/15 17:17:23 | version 1.25, 2011/12/17 01:36:54 |
|---|---|
| Line 27 | Line 27 |
| #include "cpu.h" | #include "cpu.h" |
| #include "ia32.mcr" | #include "ia32.mcr" |
| #define TSS_SIZE_16 44 | #define TSS_16_SIZE 44 |
| #define TSS_SIZE_32 108 | #define TSS_16_LIMIT (TSS_16_SIZE - 1) |
| #define TSS_32_SIZE 104 | |
| #define TSS_32_LIMIT (TSS_32_SIZE - 1) | |
| static void | static void |
| set_task_busy(UINT16 selector, descriptor_t *sdp) | set_task_busy(UINT16 selector, descriptor_t *sdp) |
| Line 82 load_tr(UINT16 selector) | Line 84 load_tr(UINT16 selector) |
| /* check descriptor type & stack room size */ | /* check descriptor type & stack room size */ |
| switch (task_sel.desc.type) { | switch (task_sel.desc.type) { |
| case CPU_SYSDESC_TYPE_TSS_16: | case CPU_SYSDESC_TYPE_TSS_16: |
| if (task_sel.desc.u.seg.limit < TSS_SIZE_16) { | if (task_sel.desc.u.seg.limit < TSS_16_LIMIT) { |
| EXCEPTION(TS_EXCEPTION, task_sel.idx); | EXCEPTION(TS_EXCEPTION, task_sel.idx); |
| } | } |
| iobase = 0; | iobase = 0; |
| break; | break; |
| case CPU_SYSDESC_TYPE_TSS_32: | case CPU_SYSDESC_TYPE_TSS_32: |
| if (task_sel.desc.u.seg.limit < TSS_SIZE_32) { | if (task_sel.desc.u.seg.limit < TSS_32_LIMIT) { |
| EXCEPTION(TS_EXCEPTION, task_sel.idx); | EXCEPTION(TS_EXCEPTION, task_sel.idx); |
| } | } |
| iobase = cpu_kmemoryread_w(task_sel.desc.u.seg.segbase + 102); | iobase = cpu_kmemoryread_w(task_sel.desc.u.seg.segbase + 102); |
| Line 215 task_switch(selector_t *task_sel, task_s | Line 217 task_switch(selector_t *task_sel, task_s |
| switch (task_sel->desc.type) { | switch (task_sel->desc.type) { |
| case CPU_SYSDESC_TYPE_TSS_32: | case CPU_SYSDESC_TYPE_TSS_32: |
| case CPU_SYSDESC_TYPE_TSS_BUSY_32: | case CPU_SYSDESC_TYPE_TSS_BUSY_32: |
| if (task_sel->desc.u.seg.limit < TSS_SIZE_32) { | if (task_sel->desc.u.seg.limit < TSS_32_LIMIT) { |
| EXCEPTION(TS_EXCEPTION, task_sel->idx); | EXCEPTION(TS_EXCEPTION, task_sel->idx); |
| } | } |
| task16 = 0; | task16 = 0; |
| Line 223 task_switch(selector_t *task_sel, task_s | Line 225 task_switch(selector_t *task_sel, task_s |
| case CPU_SYSDESC_TYPE_TSS_16: | case CPU_SYSDESC_TYPE_TSS_16: |
| case CPU_SYSDESC_TYPE_TSS_BUSY_16: | case CPU_SYSDESC_TYPE_TSS_BUSY_16: |
| if (task_sel->desc.u.seg.limit < TSS_SIZE_16) { | if (task_sel->desc.u.seg.limit < TSS_16_LIMIT) { |
| EXCEPTION(TS_EXCEPTION, task_sel->idx); | EXCEPTION(TS_EXCEPTION, task_sel->idx); |
| } | } |
| task16 = 1; | task16 = 1; |