|
|
| version 1.1, 2003/12/08 00:55:31 | version 1.4, 2004/01/27 15:55:26 |
|---|---|
| Line 82 typedef struct { | Line 82 typedef struct { |
| BYTE d; /* 0 = 16bit, 1 = 32bit */ | BYTE d; /* 0 = 16bit, 1 = 32bit */ |
| BYTE flag; | BYTE flag; |
| #define CPU_DESC_READABLE (1 << 0) | #define CPU_DESC_FLAG_READABLE (1 << 0) |
| #define CPU_DESC_WRITABLE (1 << 1) | #define CPU_DESC_FLAG_WRITABLE (1 << 1) |
| BYTE b_pad; | BYTE b_pad; |
| } descriptor_t; | } descriptor_t; |
| /* | |
| * セグメント・ディスクリプタ | |
| * | |
| * 31 24 23 22 21 20 19 16 15 14 13 12 11 8 7 0 | |
| * +----------------+--+--+--+--+-------+--+-----+--+-------+---------------+ | |
| * | Base 31..16 | G|DB| 0| A|limit_h| P| DPL | S| type | Base 23:16 | 4 | |
| * +----------------+--+--+--+--+-------+--+-----+--+-------+---------------+ | |
| * 31 16 15 0 | |
| * +------------------------------------+-----------------------------------+ | |
| * | Base 15..00 | limit 15..0 | 0 | |
| * +------------------------------------+-----------------------------------+ | |
| */ | |
| /* descriptor common */ | |
| #define CPU_DESC_H_TYPE (0xf << 8) | #define CPU_DESC_H_TYPE (0xf << 8) |
| #define CPU_DESC_H_S ( 1 << 12) /* 0 = system, 1 = code/data */ | #define CPU_DESC_H_S ( 1 << 12) /* 0 = system, 1 = code/data */ |
| #define CPU_DESC_H_DPL ( 3 << 13) | #define CPU_DESC_H_DPL ( 3 << 13) |
| Line 132 typedef struct { | Line 147 typedef struct { |
| /* CPU_SYSDESC_TYPE_TASK 0x05 */ | /* CPU_SYSDESC_TYPE_TASK 0x05 */ |
| #define CPU_SYSDESC_TYPE_INTR 0x06 | #define CPU_SYSDESC_TYPE_INTR 0x06 |
| #define CPU_SYSDESC_TYPE_TRAP 0x07 | #define CPU_SYSDESC_TYPE_TRAP 0x07 |
| #define CPU_SYSDESC_TYPE_MASKBIT 0x07 | |
| #define CPU_SYSDESC_TYPE_TSS_BUSY_IND 0x02 | #define CPU_SYSDESC_TYPE_TSS_BUSY_IND 0x02 |
| Line 143 do { \ | Line 159 do { \ |
| (dscp)->u.seg.g = 0; \ | (dscp)->u.seg.g = 0; \ |
| (dscp)->valid = 1; \ | (dscp)->valid = 1; \ |
| (dscp)->p = 1; \ | (dscp)->p = 1; \ |
| (dscp)->type = ((idx) == CPU_CS_INDEX) ? 0x0a : \ | (dscp)->type = 0x02 /* writable */; \ |
| (((idx) == CPU_SS_INDEX) ? 0x06 : 0x02); \ | |
| (dscp)->dpl = 0; \ | (dscp)->dpl = 0; \ |
| (dscp)->s = 1; /* code/data */ \ | (dscp)->s = 1; /* code/data */ \ |
| (dscp)->d = 0; \ | (dscp)->d = 0; \ |
| Line 153 do { \ | Line 168 do { \ |
| #define CPU_SET_SEGDESC_POSTPART(dscp) \ | #define CPU_SET_SEGDESC_POSTPART(dscp) \ |
| do { \ | do { \ |
| if ((dscp)->s) { \ | if ((dscp)->valid) { \ |
| if (!((dscp)->h & CPU_SEGDESC_H_A)) { \ | if ((dscp)->s) { \ |
| (dscp)->h |= CPU_SEGDESC_H_A; \ | if (!((dscp)->h & CPU_SEGDESC_H_A)) { \ |
| cpu_memorywrite_d((dscp)->addr + 4, (dscp)->h); \ | (dscp)->h |= CPU_SEGDESC_H_A; \ |
| cpu_lmemorywrite_d((dscp)->addr+4, (dscp)->h); \ | |
| } \ | |
| } \ | } \ |
| } else { \ | |
| ia32_panic("CPU_SET_SEGDESC_POSTPART: descriptor is invalid"); \ | |
| } \ | } \ |
| } while (/*CONSTCOND*/ 0) | } while (/*CONSTCOND*/ 0) |
| #define CPU_SET_TASK_BUSY(dscp) \ | #define CPU_SET_TASK_BUSY(dscp) \ |
| do { \ | do { \ |
| DWORD h; \ | if ((dscp)->valid) { \ |
| h = cpu_memoryread_d((dscp)->addr + 4); \ | DWORD h; \ |
| if (!(h & CPU_TSS_H_BUSY)) { \ | h = cpu_lmemoryread_d((dscp)->addr + 4); \ |
| (dscp)->type |= CPU_SYSDESC_TYPE_TSS_BUSY_IND; \ | if (!(h & CPU_TSS_H_BUSY)) { \ |
| h |= CPU_TSS_H_BUSY; \ | (dscp)->type |= CPU_SYSDESC_TYPE_TSS_BUSY_IND; \ |
| cpu_memorywrite_d((dscp)->addr + 4, h); \ | h |= CPU_TSS_H_BUSY; \ |
| cpu_lmemorywrite_d((dscp)->addr + 4, h); \ | |
| } else { \ | |
| ia32_panic("CPU_SET_TASK_BUSY: already busy (%x)", h); \ | |
| } \ | |
| } else { \ | } else { \ |
| ia32_panic("CPU_SET_TASK_BUSY: already busy (%x)", h); \ | ia32_panic("CPU_SET_TASK_BUSY: descriptor is invalid"); \ |
| } \ | } \ |
| } while (/*CONSTCOND*/ 0) | } while (/*CONSTCOND*/ 0) |
| #define CPU_SET_TASK_FREE(dscp) \ | #define CPU_SET_TASK_FREE(dscp) \ |
| do { \ | do { \ |
| DWORD h; \ | if ((dscp)->valid) { \ |
| h = cpu_memoryread_d((dscp)->addr + 4); \ | DWORD h; \ |
| if (h & CPU_TSS_H_BUSY) { \ | h = cpu_lmemoryread_d((dscp)->addr + 4); \ |
| (dscp)->type &= ~CPU_SYSDESC_TYPE_TSS_BUSY_IND; \ | if (h & CPU_TSS_H_BUSY) { \ |
| h &= ~CPU_TSS_H_BUSY; \ | (dscp)->type &= ~CPU_SYSDESC_TYPE_TSS_BUSY_IND; \ |
| cpu_memorywrite_d((dscp)->addr + 4, h); \ | h &= ~CPU_TSS_H_BUSY; \ |
| cpu_lmemorywrite_d((dscp)->addr + 4, h); \ | |
| } else { \ | |
| ia32_panic("CPU_SET_TASK_FREE: already free (%x)", h); \ | |
| } \ | |
| } else { \ | } else { \ |
| ia32_panic("CPU_SET_TASK_FREE: already free (%x)", h); \ | ia32_panic("CPU_SET_TASK_FREE: descriptor is invalid"); \ |
| } \ | } \ |
| } while (/*CONSTCOND*/ 0) | } while (/*CONSTCOND*/ 0) |