| 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) | 
 |  |  |