140 (void (*)())get_hrtime, /* T_GETHRTIME */
141 (void (*)())gethrvtime, /* T_GETHRVTIME */
142 (void (*)())get_hrestime, /* T_GETHRESTIME */
143 (void (*)())getlgrp /* T_GETLGRP */
144 };
145
146 /*
147 * Structure containing pre-computed descriptors to allow us to temporarily
148 * interpose on a standard handler.
149 */
150 struct interposing_handler {
151 int ih_inum;
152 gate_desc_t ih_interp_desc;
153 gate_desc_t ih_default_desc;
154 };
155
156 /*
157 * The brand infrastructure interposes on two handlers, and we use one as a
158 * NULL signpost.
159 */
160 static struct interposing_handler brand_tbl[2];
161
162 /*
163 * software prototypes for default local descriptor table
164 */
165
166 /*
167 * Routines for loading segment descriptors in format the hardware
168 * can understand.
169 */
170
171 #if defined(__amd64)
172
173 /*
174 * In long mode we have the new L or long mode attribute bit
175 * for code segments. Only the conforming bit in type is used along
176 * with descriptor priority and present bits. Default operand size must
177 * be zero when in long mode. In 32-bit compatibility mode all fields
178 * are treated as in legacy mode. For data segments while in long mode
179 * only the present bit is loaded.
180 */
956
957 /*
958 * T_EXTOVRFLT coprocessor-segment-overrun not supported.
959 */
960
961 set_gatesegd(&idt[T_TSSFLT], &invtsstrap, KCS_SEL, SDT_SYSIGT, TRP_KPL,
962 0);
963 set_gatesegd(&idt[T_SEGFLT], &segnptrap, KCS_SEL, SDT_SYSIGT, TRP_KPL,
964 0);
965 set_gatesegd(&idt[T_STKFLT], &stktrap, KCS_SEL, SDT_SYSIGT, TRP_KPL, 0);
966 set_gatesegd(&idt[T_GPFLT], &gptrap, KCS_SEL, SDT_SYSIGT, TRP_KPL, 0);
967 set_gatesegd(&idt[T_PGFLT], &pftrap, KCS_SEL, SDT_SYSIGT, TRP_KPL, 0);
968 set_gatesegd(&idt[T_EXTERRFLT], &ndperr, KCS_SEL, SDT_SYSIGT, TRP_KPL,
969 0);
970 set_gatesegd(&idt[T_ALIGNMENT], &achktrap, KCS_SEL, SDT_SYSIGT,
971 TRP_KPL, 0);
972 set_gatesegd(&idt[T_MCE], &mcetrap, KCS_SEL, SDT_SYSIGT, TRP_KPL, 0);
973 set_gatesegd(&idt[T_SIMDFPE], &xmtrap, KCS_SEL, SDT_SYSIGT, TRP_KPL, 0);
974
975 /*
976 * install fast trap handler at 210.
977 */
978 set_gatesegd(&idt[T_FASTTRAP], &fasttrap, KCS_SEL, SDT_SYSIGT, TRP_UPL,
979 0);
980
981 /*
982 * System call handler.
983 */
984 #if defined(__amd64)
985 set_gatesegd(&idt[T_SYSCALLINT], &sys_syscall_int, KCS_SEL, SDT_SYSIGT,
986 TRP_UPL, 0);
987
988 #elif defined(__i386)
989 set_gatesegd(&idt[T_SYSCALLINT], &sys_call, KCS_SEL, SDT_SYSIGT,
990 TRP_UPL, 0);
991 #endif /* __i386 */
992
993 /*
994 * Install the DTrace interrupt handler for the pid provider.
995 */
996 set_gatesegd(&idt[T_DTRACE_RET], &dtrace_ret, KCS_SEL,
997 SDT_SYSIGT, TRP_UPL, 0);
998
999 /*
1000 * Prepare interposing descriptor for the syscall handler
1001 * and cache copy of the default descriptor.
1002 */
1003 brand_tbl[0].ih_inum = T_SYSCALLINT;
1004 brand_tbl[0].ih_default_desc = idt0[T_SYSCALLINT];
1005
1006 #if defined(__amd64)
1007 set_gatesegd(&(brand_tbl[0].ih_interp_desc), &brand_sys_syscall_int,
1008 KCS_SEL, SDT_SYSIGT, TRP_UPL, 0);
1009 #elif defined(__i386)
1010 set_gatesegd(&(brand_tbl[0].ih_interp_desc), &brand_sys_call,
1011 KCS_SEL, SDT_SYSIGT, TRP_UPL, 0);
1012 #endif /* __i386 */
1013
1014 brand_tbl[1].ih_inum = 0;
1015 }
1016
1017 #if defined(__xpv)
1018
1019 static void
1020 init_idt(gate_desc_t *idt)
1021 {
1022 init_idt_common(idt);
1023 }
1024
1025 #else /* __xpv */
1026
1027 static void
1028 init_idt(gate_desc_t *idt)
1029 {
1030 char ivctname[80];
1031 void (*ivctptr)(void);
1032 int i;
1033
1034 /*
|
140 (void (*)())get_hrtime, /* T_GETHRTIME */
141 (void (*)())gethrvtime, /* T_GETHRVTIME */
142 (void (*)())get_hrestime, /* T_GETHRESTIME */
143 (void (*)())getlgrp /* T_GETLGRP */
144 };
145
146 /*
147 * Structure containing pre-computed descriptors to allow us to temporarily
148 * interpose on a standard handler.
149 */
150 struct interposing_handler {
151 int ih_inum;
152 gate_desc_t ih_interp_desc;
153 gate_desc_t ih_default_desc;
154 };
155
156 /*
157 * The brand infrastructure interposes on two handlers, and we use one as a
158 * NULL signpost.
159 */
160 static struct interposing_handler brand_tbl[3];
161
162 /*
163 * software prototypes for default local descriptor table
164 */
165
166 /*
167 * Routines for loading segment descriptors in format the hardware
168 * can understand.
169 */
170
171 #if defined(__amd64)
172
173 /*
174 * In long mode we have the new L or long mode attribute bit
175 * for code segments. Only the conforming bit in type is used along
176 * with descriptor priority and present bits. Default operand size must
177 * be zero when in long mode. In 32-bit compatibility mode all fields
178 * are treated as in legacy mode. For data segments while in long mode
179 * only the present bit is loaded.
180 */
956
957 /*
958 * T_EXTOVRFLT coprocessor-segment-overrun not supported.
959 */
960
961 set_gatesegd(&idt[T_TSSFLT], &invtsstrap, KCS_SEL, SDT_SYSIGT, TRP_KPL,
962 0);
963 set_gatesegd(&idt[T_SEGFLT], &segnptrap, KCS_SEL, SDT_SYSIGT, TRP_KPL,
964 0);
965 set_gatesegd(&idt[T_STKFLT], &stktrap, KCS_SEL, SDT_SYSIGT, TRP_KPL, 0);
966 set_gatesegd(&idt[T_GPFLT], &gptrap, KCS_SEL, SDT_SYSIGT, TRP_KPL, 0);
967 set_gatesegd(&idt[T_PGFLT], &pftrap, KCS_SEL, SDT_SYSIGT, TRP_KPL, 0);
968 set_gatesegd(&idt[T_EXTERRFLT], &ndperr, KCS_SEL, SDT_SYSIGT, TRP_KPL,
969 0);
970 set_gatesegd(&idt[T_ALIGNMENT], &achktrap, KCS_SEL, SDT_SYSIGT,
971 TRP_KPL, 0);
972 set_gatesegd(&idt[T_MCE], &mcetrap, KCS_SEL, SDT_SYSIGT, TRP_KPL, 0);
973 set_gatesegd(&idt[T_SIMDFPE], &xmtrap, KCS_SEL, SDT_SYSIGT, TRP_KPL, 0);
974
975 /*
976 * install "int80" handler at, well, 0x80.
977 */
978 set_gatesegd(&idt0[T_INT80], &sys_int80, KCS_SEL, SDT_SYSIGT, TRP_UPL,
979 0);
980
981 /*
982 * install fast trap handler at 210.
983 */
984 set_gatesegd(&idt[T_FASTTRAP], &fasttrap, KCS_SEL, SDT_SYSIGT, TRP_UPL,
985 0);
986
987 /*
988 * System call handler.
989 */
990 #if defined(__amd64)
991 set_gatesegd(&idt[T_SYSCALLINT], &sys_syscall_int, KCS_SEL, SDT_SYSIGT,
992 TRP_UPL, 0);
993
994 #elif defined(__i386)
995 set_gatesegd(&idt[T_SYSCALLINT], &sys_call, KCS_SEL, SDT_SYSIGT,
996 TRP_UPL, 0);
997 #endif /* __i386 */
998
999 /*
1000 * Install the DTrace interrupt handler for the pid provider.
1001 */
1002 set_gatesegd(&idt[T_DTRACE_RET], &dtrace_ret, KCS_SEL,
1003 SDT_SYSIGT, TRP_UPL, 0);
1004
1005 /*
1006 * Prepare interposing descriptors for the branded "int80"
1007 * and syscall handlers and cache copies of the default
1008 * descriptors.
1009 */
1010 brand_tbl[0].ih_inum = T_INT80;
1011 brand_tbl[0].ih_default_desc = idt0[T_INT80];
1012 set_gatesegd(&(brand_tbl[0].ih_interp_desc), &brand_sys_int80, KCS_SEL,
1013 SDT_SYSIGT, TRP_UPL, 0);
1014
1015 brand_tbl[1].ih_inum = T_SYSCALLINT;
1016 brand_tbl[1].ih_default_desc = idt0[T_SYSCALLINT];
1017
1018 #if defined(__amd64)
1019 set_gatesegd(&(brand_tbl[1].ih_interp_desc), &brand_sys_syscall_int,
1020 KCS_SEL, SDT_SYSIGT, TRP_UPL, 0);
1021 #elif defined(__i386)
1022 set_gatesegd(&(brand_tbl[1].ih_interp_desc), &brand_sys_call,
1023 KCS_SEL, SDT_SYSIGT, TRP_UPL, 0);
1024 #endif /* __i386 */
1025
1026 brand_tbl[2].ih_inum = 0;
1027 }
1028
1029 #if defined(__xpv)
1030
1031 static void
1032 init_idt(gate_desc_t *idt)
1033 {
1034 init_idt_common(idt);
1035 }
1036
1037 #else /* __xpv */
1038
1039 static void
1040 init_idt(gate_desc_t *idt)
1041 {
1042 char ivctname[80];
1043 void (*ivctptr)(void);
1044 int i;
1045
1046 /*
|