|
|
| version 1.5, 2004/02/04 13:24:35 | version 1.6, 2004/02/05 16:43:44 |
|---|---|
| Line 66 typedef struct { | Line 66 typedef struct { |
| BYTE type; /* descriptor type */ | BYTE type; /* descriptor type */ |
| BYTE dpl; /* DPL */ | BYTE dpl; /* DPL */ |
| BYTE rpl; /* RPL */ | |
| BYTE s; /* 0 = system, 1 = code/data */ | BYTE s; /* 0 = system, 1 = code/data */ |
| BYTE d; /* 0 = 16bit, 1 = 32bit */ | BYTE d; /* 0 = 16bit, 1 = 32bit */ |
| BYTE flag; | BYTE flag; |
| #define CPU_DESC_FLAG_READABLE (1 << 0) | #define CPU_DESC_FLAG_READABLE (1 << 0) |
| #define CPU_DESC_FLAG_WRITABLE (1 << 1) | #define CPU_DESC_FLAG_WRITABLE (1 << 1) |
| BYTE b_pad; | |
| } descriptor_t; | } descriptor_t; |
| Line 147 do { \ | Line 146 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 = 0x02 /* writable */; \ | (dscp)->type = 0x02; /* writable */ \ |
| (dscp)->dpl = 0; \ | (dscp)->dpl = 0; \ |
| (dscp)->s = 1; /* code/data */ \ | (dscp)->s = 1; /* code/data */ \ |
| (dscp)->d = 0; \ | (dscp)->d = 0; /* 16bit */ \ |
| (dscp)->flag = 0; \ | (dscp)->flag = CPU_DESC_FLAG_READABLE|CPU_DESC_FLAG_WRITABLE; \ |
| } while (/*CONSTCOND*/ 0) | } while (/*CONSTCOND*/ 0) |
| #define CPU_SET_TASK_BUSY(selector, dscp) \ | #define CPU_SET_TASK_BUSY(selector, dscp) \ |
| do { \ | do { \ |
| DWORD addr; \ | DWORD addr; \ |
| DWORD h; \ | DWORD h; \ |
| addr = CPU_GDTR_BASE | ((selector) & CPU_SEGMENT_SELECTOR_INDEX_MASK); \ | addr = CPU_GDTR_BASE + ((selector) & CPU_SEGMENT_SELECTOR_INDEX_MASK); \ |
| h = cpu_kmemoryread_d(addr + 4); \ | h = cpu_kmemoryread_d(addr + 4); \ |
| if (!(h & CPU_TSS_H_BUSY)) { \ | if (!(h & CPU_TSS_H_BUSY)) { \ |
| (dscp)->type |= CPU_SYSDESC_TYPE_TSS_BUSY_IND; \ | (dscp)->type |= CPU_SYSDESC_TYPE_TSS_BUSY_IND; \ |
| Line 173 do { \ | Line 172 do { \ |
| do { \ | do { \ |
| DWORD addr; \ | DWORD addr; \ |
| DWORD h; \ | DWORD h; \ |
| addr = CPU_GDTR_BASE | ((selector) & CPU_SEGMENT_SELECTOR_INDEX_MASK); \ | addr = CPU_GDTR_BASE + ((selector) & CPU_SEGMENT_SELECTOR_INDEX_MASK); \ |
| h = cpu_kmemoryread_d(addr + 4); \ | h = cpu_kmemoryread_d(addr + 4); \ |
| if (h & CPU_TSS_H_BUSY) { \ | if (h & CPU_TSS_H_BUSY) { \ |
| (dscp)->type &= ~CPU_SYSDESC_TYPE_TSS_BUSY_IND; \ | (dscp)->type &= ~CPU_SYSDESC_TYPE_TSS_BUSY_IND; \ |
| Line 184 do { \ | Line 183 do { \ |
| } \ | } \ |
| } while (/*CONSTCOND*/ 0) | } while (/*CONSTCOND*/ 0) |
| #define CPU_SET_SEGDESC(descp, addr, mode) load_descriptor(descp, addr, mode) | void load_descriptor(descriptor_t *descp, DWORD addr); |
| #define CPU_SET_GATEDESC(descp, addr, mode) load_descriptor(descp, addr, mode) | |
| void load_descriptor(descriptor_t* descp, DWORD addr, int user_mode); | |
| #define CPU_SET_SEGREG(idx, selector) load_segreg(idx, selector, GP_EXCEPTION) | #define CPU_SET_SEGREG(idx, selector) load_segreg(idx, selector, GP_EXCEPTION) |
| void load_segreg(int idx, WORD selector, int exc); | void load_segreg(int idx, WORD selector, int exc); |
| Line 198 void load_ldtr(WORD selector, int exc); | Line 195 void load_ldtr(WORD selector, int exc); |
| /* | /* |
| * segment selector | * segment selector |
| */ | */ |
| #define CPU_SEGMENT_SELECTOR_INDEX_MASK ~7 | #define CPU_SEGMENT_SELECTOR_INDEX_MASK (~7) |
| #define CPU_SEGMENT_SELECTOR_RPL_MASK 3 | #define CPU_SEGMENT_SELECTOR_RPL_MASK (3) |
| #define CPU_SEGMENT_TABLE_IND (1 << 2) /* 0 = GDT, 1 = LDT */ | #define CPU_SEGMENT_TABLE_IND (1 << 2) /* 0 = GDT, 1 = LDT */ |
| typedef struct { | typedef struct { |
| Line 209 typedef struct { | Line 206 typedef struct { |
| BYTE ldt; | BYTE ldt; |
| BYTE pad; | BYTE pad; |
| int user_mode; /* superviser/user mode */ | |
| DWORD addr; /* descriptor linear address */ | DWORD addr; /* descriptor linear address */ |
| descriptor_t desc; | descriptor_t desc; |
| } selector_t; | } selector_t; |
| int parse_selector(selector_t *ssp, WORD selector, int user_mode); | int parse_selector(selector_t *ssp, WORD selector); |
| int selector_is_not_present(selector_t *ssp); | int selector_is_not_present(selector_t *ssp); |
| #define parse_selector_sv(sp, s) parse_selector(sp, s, CPU_MODE_SUPERVISER) | |
| #define parse_selector_user(sp, s) parse_selector(sp, s, CPU_IS_USER_MODE()) | |
| #ifdef __cplusplus | #ifdef __cplusplus |
| } | } |
| #endif | #endif |