--- np2/i386c/ia32/segments.h 2004/02/04 13:24:35 1.5 +++ np2/i386c/ia32/segments.h 2004/02/20 16:09:04 1.7 @@ -1,4 +1,4 @@ -/* $Id: segments.h,v 1.5 2004/02/04 13:24:35 monaka Exp $ */ +/* $Id: segments.h,v 1.7 2004/02/20 16:09:04 monaka Exp $ */ /* * Copyright (c) 2003 NONAKA Kimihiro @@ -40,40 +40,39 @@ extern "C" { typedef struct { union { struct { - DWORD segbase; - DWORD segend; - DWORD limit; - - BYTE c; /* 0 = data, 1 = code */ - BYTE g; /* 4k base */ - BYTE wr; /* readable/writable */ - BYTE ec; /* expand down/conforming */ + UINT32 segbase; + UINT32 segend; + UINT32 limit; + + UINT8 c; /* 0 = data, 1 = code */ + UINT8 g; /* 4k base */ + UINT8 wr; /* readable/writable */ + UINT8 ec; /* expand down/conforming */ } seg; struct { - WORD selector; - WORD w_pad; - DWORD offset; + UINT16 selector; + UINT16 w_pad; + UINT32 offset; - BYTE count; /* parameter count:call gate */ + UINT8 count; /* parameter count:call gate */ - BYTE b_pad[7]; + UINT8 b_pad[7]; } gate; } u; - BYTE valid; /* descriptor valid flag */ - BYTE p; /* avail flag */ + UINT8 valid; /* descriptor valid flag */ + UINT8 p; /* avail flag */ - BYTE type; /* descriptor type */ - BYTE dpl; /* DPL */ - BYTE s; /* 0 = system, 1 = code/data */ - BYTE d; /* 0 = 16bit, 1 = 32bit */ + UINT8 type; /* descriptor type */ + UINT8 dpl; /* DPL */ + UINT8 rpl; /* RPL */ + UINT8 s; /* 0 = system, 1 = code/data */ + UINT8 d; /* 0 = 16bit, 1 = 32bit */ - BYTE flag; + UINT8 flag; #define CPU_DESC_FLAG_READABLE (1 << 0) #define CPU_DESC_FLAG_WRITABLE (1 << 1) - - BYTE b_pad; } descriptor_t; @@ -141,24 +140,24 @@ typedef struct { #define CPU_SET_SEGDESC_DEFAULT(dscp, idx, selector) \ do { \ - (dscp)->u.seg.segbase = (DWORD)(selector) << 4; \ + (dscp)->u.seg.segbase = (UINT32)(selector) << 4; \ (dscp)->u.seg.segend = (dscp)->u.seg.segbase + (dscp)->u.seg.limit; \ (dscp)->u.seg.c = ((idx) == CPU_CS_INDEX) ? 1 : 0; \ (dscp)->u.seg.g = 0; \ (dscp)->valid = 1; \ (dscp)->p = 1; \ - (dscp)->type = 0x02 /* writable */; \ + (dscp)->type = 0x02; /* writable */ \ (dscp)->dpl = 0; \ (dscp)->s = 1; /* code/data */ \ - (dscp)->d = 0; \ - (dscp)->flag = 0; \ + (dscp)->d = 0; /* 16bit */ \ + (dscp)->flag = CPU_DESC_FLAG_READABLE|CPU_DESC_FLAG_WRITABLE; \ } while (/*CONSTCOND*/ 0) #define CPU_SET_TASK_BUSY(selector, dscp) \ do { \ - DWORD addr; \ - DWORD h; \ - addr = CPU_GDTR_BASE | ((selector) & CPU_SEGMENT_SELECTOR_INDEX_MASK); \ + UINT32 addr; \ + UINT32 h; \ + addr = CPU_GDTR_BASE + ((selector) & CPU_SEGMENT_SELECTOR_INDEX_MASK); \ h = cpu_kmemoryread_d(addr + 4); \ if (!(h & CPU_TSS_H_BUSY)) { \ (dscp)->type |= CPU_SYSDESC_TYPE_TSS_BUSY_IND; \ @@ -171,9 +170,9 @@ do { \ #define CPU_SET_TASK_FREE(selector, dscp) \ do { \ - DWORD addr; \ - DWORD h; \ - addr = CPU_GDTR_BASE | ((selector) & CPU_SEGMENT_SELECTOR_INDEX_MASK); \ + UINT32 addr; \ + UINT32 h; \ + addr = CPU_GDTR_BASE + ((selector) & CPU_SEGMENT_SELECTOR_INDEX_MASK); \ h = cpu_kmemoryread_d(addr + 4); \ if (h & CPU_TSS_H_BUSY) { \ (dscp)->type &= ~CPU_SYSDESC_TYPE_TSS_BUSY_IND; \ @@ -184,43 +183,37 @@ do { \ } \ } while (/*CONSTCOND*/ 0) -#define CPU_SET_SEGDESC(descp, addr, mode) load_descriptor(descp, addr, mode) -#define CPU_SET_GATEDESC(descp, addr, mode) load_descriptor(descp, addr, mode) -void load_descriptor(descriptor_t* descp, DWORD addr, int user_mode); +void load_descriptor(descriptor_t *descp, UINT32 addr); #define CPU_SET_SEGREG(idx, selector) load_segreg(idx, selector, GP_EXCEPTION) -void load_segreg(int idx, WORD selector, int exc); -void load_ss(WORD selector, descriptor_t* sdp, DWORD cpl); -void load_cs(WORD selector, descriptor_t* sdp, DWORD cpl); -void load_ldtr(WORD selector, int exc); +void load_segreg(int idx, UINT16 selector, int exc); +void load_ss(UINT16 selector, descriptor_t *sd, UINT cpl); +void load_cs(UINT16 selector, descriptor_t *sd, UINT cpl); +void load_ldtr(UINT16 selector, int exc); /* * segment selector */ -#define CPU_SEGMENT_SELECTOR_INDEX_MASK ~7 -#define CPU_SEGMENT_SELECTOR_RPL_MASK 3 +#define CPU_SEGMENT_SELECTOR_INDEX_MASK (~7) +#define CPU_SEGMENT_SELECTOR_RPL_MASK (3) #define CPU_SEGMENT_TABLE_IND (1 << 2) /* 0 = GDT, 1 = LDT */ typedef struct { - WORD selector; - WORD idx; - WORD rpl; - BYTE ldt; - BYTE pad; + UINT16 selector; + UINT16 idx; + UINT16 rpl; + UINT8 ldt; + UINT8 pad; - int user_mode; /* superviser/user mode */ - DWORD addr; /* descriptor linear address */ + UINT32 addr; /* descriptor linear address */ descriptor_t desc; } selector_t; -int parse_selector(selector_t *ssp, WORD selector, int user_mode); +int parse_selector(selector_t *ssp, UINT16 selector); 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 } #endif