Date: Mon, 23 Sep 2002 10:57:51 -0700 (PDT) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 18002 for review Message-ID: <200209231757.g8NHvpMc061115@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://people.freebsd.org/~peter/p4db/chv.cgi?CH=18002 Change 18002 by peter@peter_overcee on 2002/09/23 10:57:37 some more updates. Rip out the unused evil ISxxx() macros. I think they're unused on i386 as well. union descriptor is gone because the gdt is a mixture of different sized descriptors now(!) instead of an array with a fixed size record. There is some evil overlap protection to trap offsets by having a couple of must-be-zero fields that will expand to SDT_SYSNULL if the second half is accessed as a short descriptor in error. Affected files ... .. //depot/projects/hammer/sys/x86_64/include/segments.h#8 edit Differences ... ==== //depot/projects/hammer/sys/x86_64/include/segments.h#8 (text+ko) ==== @@ -60,53 +60,58 @@ #define GSEL(s,r) (((s)<<3) | r) /* a global selector */ /* - * Memory segment descriptors (%cs, %ds etc for compatability apps. 32 bit wide) + * User segment descriptors (%cs, %ds etc for compatability apps. 64 bit wide) + * For long-mode apps, %cs only has the conforming bit in sd_type, the sd_dpl, + * sd_p, sd_l and sd_def32 which must be zero). %ds only has sd_p. */ -struct segment_descriptor { - unsigned sd_lolimit:16 ; /* segment extent (lsb) */ - unsigned sd_lobase:24 __packed; /* segment base address (lsb) */ - unsigned sd_type:5 ; /* segment type */ - unsigned sd_dpl:2 ; /* segment descriptor priority level */ - unsigned sd_p:1 ; /* segment descriptor present */ - unsigned sd_hilimit:4 ; /* segment extent (msb) */ - unsigned sd_xx:1 ; /* unused */ - unsigned sd_l:2 ; /* long mode (cs only) */ - unsigned sd_def32:1 ; /* default 32 vs 16 bit size */ - unsigned sd_gran:1 ; /* limit granularity (byte/page units)*/ - unsigned sd_hibase:8 ; /* segment base address (msb) */ +struct user_segment_descriptor { + u_int64_t sd_lolimit:16; /* segment extent (lsb) */ + u_int64_t sd_lobase:24; /* segment base address (lsb) */ + u_int64_t sd_type:5; /* segment type */ + u_int64_t sd_dpl:2; /* segment descriptor priority level */ + u_int64_t sd_p:1; /* segment descriptor present */ + u_int64_t sd_hilimit:4; /* segment extent (msb) */ + u_int64_t sd_xx:1; /* unused */ + u_int64_t sd_l:2; /* long mode (cs only) */ + u_int64_t sd_def32:1; /* default 32 vs 16 bit size */ + u_int64_t sd_gran:1; /* limit granularity (byte/page units)*/ + u_int64_t sd_hibase:8; /* segment base address (msb) */ }; /* - * System segment descriptors (64 bit wide) + * System segment descriptors (128 bit wide) */ -struct segment_descriptor { - unsigned sd_lolimit:16 ; /* segment extent (lsb) */ - unsigned sd_lobase:24 __packed; /* segment base address (lsb) */ - unsigned sd_type:5 ; /* segment type */ - unsigned sd_dpl:2 ; /* segment descriptor priority level */ - unsigned sd_p:1 ; /* segment descriptor present */ - unsigned sd_hilimit:4 ; /* segment extent (msb) */ - unsigned sd_xx:1 ; /* unused */ - unsigned sd_l:2 ; /* long mode (cs only) */ - unsigned sd_def32:1 ; /* default 32 vs 16 bit size */ - unsigned sd_gran:1 ; /* limit granularity (byte/page units)*/ - unsigned sd_hibase:8 ; /* segment base address (msb) */ +struct system_segment_descriptor { + u_int64_t sd_lolimit:16; /* segment extent (lsb) */ + u_int64_t sd_lobase:24; /* segment base address (lsb) */ + u_int64_t sd_type:5; /* segment type */ + u_int64_t sd_dpl:2; /* segment descriptor priority level */ + u_int64_t sd_p:1; /* segment descriptor present */ + u_int64_t sd_hilimit:4; /* segment extent (msb) */ + u_int64_t sd_xx0:3; /* unused */ + u_int64_t sd_gran:1; /* limit granularity (byte/page units)*/ + u_int64_t sd_hibase:40; /* segment base address (msb) */ + u_int64_t sd_xx1:8; + u_int64_t sd_mbz:5; /* MUST be zero */ + u_int64_t sd_xx1:19; }; /* - * Gate descriptors (e.g. indirect descriptors, trap, interrupt etc. 64 bit) + * Gate descriptors (e.g. indirect descriptors, trap, interrupt etc. 128 bit) + * Only interrupt and trap gates have gd_ist. */ -struct gate_descriptor { - unsigned gd_looffset:16 ; /* gate offset (lsb) */ - unsigned gd_selector:16 ; /* gate segment selector */ - unsigned gd_ist:3 ; /* IST table index */ - unsigned gd_xx:5 ; /* unused */ - unsigned gd_type:5 ; /* segment type */ - unsigned gd_dpl:2 ; /* segment descriptor priority level */ - unsigned gd_p:1 ; /* segment descriptor present */ - unsigned gd_hioffset:16 ; /* gate offset (msb) */ - unsigned gd_hihioffset:32 ; /* gate offset (bits 32-63) */ - unsigned gd_rsvd:32 ; /* reserved */ +struct gate_descriptor { + u_int64_t gd_looffset:16; /* gate offset (lsb) */ + u_int64_t gd_selector:16; /* gate segment selector */ + u_int64_t gd_ist:3; /* IST table index */ + u_int64_t gd_xx:5; /* unused */ + u_int64_t gd_type:5; /* segment type */ + u_int64_t gd_dpl:2; /* segment descriptor priority level */ + u_int64_t gd_p:1; /* segment descriptor present */ + u_int64_t gd_hioffset:38; /* gate offset (msb) */ + u_int64_t sd_xx1:8; + u_int64_t sd_mbz:5; /* MUST be zero */ + u_int64_t sd_xx1:19; }; /* system segments and gate types */ @@ -136,42 +141,22 @@ #define SDT_MEMERC 30 /* memory execute read conforming */ #define SDT_MEMERAC 31 /* memory execute read accessed conforming */ -/* is memory segment descriptor pointer ? */ -#define ISMEMSDP(s) ((s->d_type) >= SDT_MEMRO && (s->d_type) <= SDT_MEMERAC) - -/* is 286 gate descriptor pointer ? */ -#define IS286GDP(s) (((s->d_type) >= SDT_SYS286CGT \ - && (s->d_type) < SDT_SYS286TGT)) - -/* is 386 gate descriptor pointer ? */ -#define IS386GDP(s) (((s->d_type) >= SDT_SYS386CGT \ - && (s->d_type) < SDT_SYS386TGT)) - -/* is gate descriptor pointer ? */ -#define ISGDP(s) (IS286GDP(s) || IS386GDP(s)) - -/* is segment descriptor pointer ? */ -#define ISSDP(s) (ISMEMSDP(s) || !ISGDP(s)) - -/* is system segment descriptor pointer ? */ -#define ISSYSSDP(s) (!ISMEMSDP(s) && !ISGDP(s)) - /* * Software definitions are in this convenient format, * which are translated into inconvenient segment descriptors * when needed to be used by the 386 hardware */ -struct soft_segment_descriptor { - unsigned ssd_base ; /* segment base address */ - unsigned ssd_limit ; /* segment extent */ - unsigned ssd_type:5 ; /* segment type */ - unsigned ssd_dpl:2 ; /* segment descriptor priority level */ - unsigned ssd_p:1 ; /* segment descriptor present */ - unsigned ssd_xx:4 ; /* unused */ - unsigned ssd_xx1:2 ; /* unused */ - unsigned ssd_def32:1 ; /* default 32 vs 16 bit size */ - unsigned ssd_gran:1 ; /* limit granularity (byte/page units)*/ +struct soft_segment_descriptor32 { + unsigned ssd_base; /* segment base address */ + unsigned ssd_limit; /* segment extent */ + unsigned ssd_type:5; /* segment type */ + unsigned ssd_dpl:2; /* segment descriptor priority level */ + unsigned ssd_p:1; /* segment descriptor present */ + unsigned ssd_xx:4; /* unused */ + unsigned ssd_xx1:2; /* unused */ + unsigned ssd_def32:1; /* default 32 vs 16 bit size */ + unsigned ssd_gran:1; /* limit granularity (byte/page units)*/ }; /* @@ -183,16 +168,6 @@ }; /* - * Segment Protection Exception code bits - */ - -#define SEGEX_EXT 0x01 /* recursive or externally induced */ -#define SEGEX_IDT 0x02 /* interrupt descriptor table */ -#define SEGEX_TI 0x04 /* local descriptor table */ - /* other bits are affected descriptor index */ -#define SEGEX_IDX(s) (((s)>>3)&0x1fff) - -/* * Size of IDT table */ #define NIDT 129 /* 32 reserved, 16 h/w, 0 s/w, linux's 0x80 */ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200209231757.g8NHvpMc061115>