1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #include <sys/asm_linkage.h> 27 #include <sys/asm_misc.h> 28 #include <sys/regset.h> 29 #include <sys/panic.h> 30 #include <sys/ontrap.h> 31 #include <sys/privregs.h> 32 #include <sys/segments.h> 33 #include <sys/trap.h> 34 35 #if defined(__lint) 36 #include <sys/types.h> 37 #include <sys/systm.h> 38 #include <sys/thread.h> 39 #include <sys/archsystm.h> 40 #include <sys/byteorder.h> 41 #include <sys/dtrace.h> 42 #include <sys/x86_archext.h> 43 #else /* __lint */ 44 #include "assym.h" 45 #endif /* __lint */ 46 47 #if defined(__lint) 48 49 /*ARGSUSED*/ 50 void 51 rd_idtr(desctbr_t *idtr) 52 {} 53 54 /*ARGSUSED*/ 55 void 56 wr_idtr(desctbr_t *idtr) 57 {} 58 59 #else /* __lint */ 60 61 #if defined(__amd64) 62 63 ENTRY_NP(rd_idtr) 64 sidt (%rdi) 65 ret 66 SET_SIZE(rd_idtr) 67 68 ENTRY_NP(wr_idtr) 69 lidt (%rdi) 70 ret 71 SET_SIZE(wr_idtr) 72 73 #elif defined(__i386) 74 75 ENTRY_NP(rd_idtr) 76 pushl %ebp 77 movl %esp, %ebp 78 movl 8(%ebp), %edx 79 sidt (%edx) 80 leave 81 ret 82 SET_SIZE(rd_idtr) 83 84 ENTRY_NP(wr_idtr) 85 pushl %ebp 86 movl %esp, %ebp 87 movl 8(%ebp), %edx 88 lidt (%edx) 89 leave 90 ret 91 SET_SIZE(wr_idtr) 92 93 #endif /* __i386 */ 94 #endif /* __lint */ 95 96 #if defined(__lint) 97 98 /*ARGSUSED*/ 99 void 100 rd_gdtr(desctbr_t *gdtr) 101 {} 102 103 /*ARGSUSED*/ 104 void 105 wr_gdtr(desctbr_t *gdtr) 106 {} 107 108 #else /* __lint */ 109 110 #if defined(__amd64) 111 112 ENTRY_NP(rd_gdtr) 113 pushq %rbp 114 movq %rsp, %rbp 115 sgdt (%rdi) 116 leave 117 ret 118 SET_SIZE(rd_gdtr) 119 120 ENTRY_NP(wr_gdtr) 121 pushq %rbp 122 movq %rsp, %rbp 123 lgdt (%rdi) 124 jmp 1f 125 nop 126 1: 127 leave 128 ret 129 SET_SIZE(wr_gdtr) 130 131 #elif defined(__i386) 132 133 ENTRY_NP(rd_gdtr) 134 pushl %ebp 135 movl %esp, %ebp 136 movl 8(%ebp), %edx 137 sgdt (%edx) 138 leave 139 ret 140 SET_SIZE(rd_gdtr) 141 142 ENTRY_NP(wr_gdtr) 143 pushl %ebp 144 movl %esp, %ebp 145 movl 8(%ebp), %edx 146 lgdt (%edx) 147 jmp 1f 148 nop 149 1: 150 leave 151 ret 152 SET_SIZE(wr_gdtr) 153 154 #endif /* __i386 */ 155 #endif /* __lint */ 156 157 #if defined(__amd64) 158 #if defined(__lint) 159 160 /*ARGSUSED*/ 161 void 162 load_segment_registers(selector_t cs, selector_t fs, selector_t gs, 163 selector_t ss) 164 {} 165 166 selector_t 167 get_cs_register() 168 { return (0); } 169 170 #else /* __lint */ 171 172 /* 173 * loads zero selector for ds and es. 174 */ 175 ENTRY_NP(load_segment_registers) 176 pushq %rbp 177 movq %rsp, %rbp 178 pushq %rdi 179 pushq $.newcs 180 lretq 181 .newcs: 182 /* 183 * zero %ds and %es - they're ignored anyway 184 */ 185 xorl %eax, %eax 186 movw %ax, %ds 187 movw %ax, %es 188 movl %esi, %eax 189 movw %ax, %fs 190 movl %edx, %eax 191 movw %ax, %gs 192 movl %ecx, %eax 193 movw %ax, %ss 194 leave 195 ret 196 SET_SIZE(load_segment_registers) 197 198 ENTRY_NP(get_cs_register) 199 movq %cs, %rax 200 ret 201 SET_SIZE(get_cs_register) 202 203 #endif /* __lint */ 204 #elif defined(__i386) 205 206 #if defined(__lint) 207 208 /*ARGSUSED*/ 209 void 210 load_segment_registers( 211 selector_t cs, selector_t ds, selector_t es, 212 selector_t fs, selector_t gs, selector_t ss) 213 {} 214 215 selector_t 216 get_cs_register() 217 { return ((selector_t) 0); } 218 219 #else /* __lint */ 220 221 ENTRY_NP(load_segment_registers) 222 pushl %ebp 223 movl %esp, %ebp 224 225 pushl 0x8(%ebp) 226 pushl $.newcs 227 lret 228 .newcs: 229 movw 0xc(%ebp), %ax 230 movw %ax, %ds 231 movw 0x10(%ebp), %ax 232 movw %ax, %es 233 movw 0x14(%ebp), %ax 234 movw %ax, %fs 235 movw 0x18(%ebp), %ax 236 movw %ax, %gs 237 movw 0x1c(%ebp), %ax 238 movw %ax, %ss 239 leave 240 ret 241 SET_SIZE(load_segment_registers) 242 243 ENTRY_NP(get_cs_register) 244 movl $0, %eax 245 movw %cs, %ax 246 ret 247 SET_SIZE(get_cs_register) 248 249 #endif /* __lint */ 250 #endif /* __i386 */ 251 252 #if defined(__lint) 253 254 /*ARGSUSED*/ 255 void 256 wr_ldtr(selector_t ldtsel) 257 {} 258 259 selector_t 260 rd_ldtr(void) 261 { return (0); } 262 263 #else /* __lint */ 264 265 #if defined(__amd64) 266 267 ENTRY_NP(wr_ldtr) 268 movq %rdi, %rax 269 lldt %ax 270 ret 271 SET_SIZE(wr_ldtr) 272 273 ENTRY_NP(rd_ldtr) 274 xorl %eax, %eax 275 sldt %ax 276 ret 277 SET_SIZE(rd_ldtr) 278 279 #elif defined(__i386) 280 281 ENTRY_NP(wr_ldtr) 282 movw 4(%esp), %ax 283 lldt %ax 284 ret 285 SET_SIZE(wr_ldtr) 286 287 ENTRY_NP(rd_ldtr) 288 xorl %eax, %eax 289 sldt %ax 290 ret 291 SET_SIZE(rd_ldtr) 292 293 #endif /* __i386 */ 294 #endif /* __lint */ 295 296 #if defined(__lint) 297 298 /*ARGSUSED*/ 299 void 300 wr_tsr(selector_t tsssel) 301 {} 302 303 #else /* __lint */ 304 305 #if defined(__amd64) 306 307 ENTRY_NP(wr_tsr) 308 movq %rdi, %rax 309 ltr %ax 310 ret 311 SET_SIZE(wr_tsr) 312 313 #elif defined(__i386) 314 315 ENTRY_NP(wr_tsr) 316 movw 4(%esp), %ax 317 ltr %ax 318 ret 319 SET_SIZE(wr_tsr) 320 321 #endif /* __i386 */ 322 #endif /* __lint */