Print this page
104 Bring back lx brand


 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         /*