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 #pragma ident "%Z%%M% %I% %E% SMI" 27 28 #include <sys/asm_linkage.h> 29 #include <sys/asm_misc.h> 30 #include <sys/regset.h> 31 #include <sys/panic.h> 32 #include <sys/ontrap.h> 33 #include <sys/privregs.h> 34 #include <sys/segments.h> 35 #include <sys/trap.h> 36 37 #if defined(__lint) 38 #include <sys/types.h> 39 #include <sys/systm.h> 40 #include <sys/thread.h> 41 #include <sys/archsystm.h> 42 #include <sys/byteorder.h> 43 #include <sys/dtrace.h> 44 #include <sys/x86_archext.h> 45 #else /* __lint */ 46 #include "assym.h" 47 #endif /* __lint */ 48 49 #if defined(__lint) 50 51 /*ARGSUSED*/ 52 void 53 rd_idtr(desctbr_t *idtr) 54 {} 55 56 /*ARGSUSED*/ 57 void 58 wr_idtr(desctbr_t *idtr) 59 {} 60 61 #else /* __lint */ 62 63 #if defined(__amd64) 64 65 ENTRY_NP(rd_idtr) 66 sidt (%rdi) 67 ret 68 SET_SIZE(rd_idtr) 69 70 ENTRY_NP(wr_idtr) 71 lidt (%rdi) 72 ret 73 SET_SIZE(wr_idtr) 74 75 #elif defined(__i386) 76 77 ENTRY_NP(rd_idtr) 78 pushl %ebp 79 movl %esp, %ebp 80 movl 8(%ebp), %edx 81 sidt (%edx) 82 leave 83 ret 84 SET_SIZE(rd_idtr) 85 86 ENTRY_NP(wr_idtr) 87 pushl %ebp 88 movl %esp, %ebp 89 movl 8(%ebp), %edx 90 lidt (%edx) 91 leave 92 ret 93 SET_SIZE(wr_idtr) 94 95 #endif /* __i386 */ 96 #endif /* __lint */ 97 98 #if defined(__lint) 99 100 /*ARGSUSED*/ 101 void 102 rd_gdtr(desctbr_t *gdtr) 103 {} 104 105 /*ARGSUSED*/ 106 void 107 wr_gdtr(desctbr_t *gdtr) 108 {} 109 110 #else /* __lint */ 111 112 #if defined(__amd64) 113 114 ENTRY_NP(rd_gdtr) 115 pushq %rbp 116 movq %rsp, %rbp 117 sgdt (%rdi) 118 leave 119 ret 120 SET_SIZE(rd_gdtr) 121 122 ENTRY_NP(wr_gdtr) 123 pushq %rbp 124 movq %rsp, %rbp 125 lgdt (%rdi) 126 jmp 1f 127 nop 128 1: 129 leave 130 ret 131 SET_SIZE(wr_gdtr) 132 133 #elif defined(__i386) 134 135 ENTRY_NP(rd_gdtr) 136 pushl %ebp 137 movl %esp, %ebp 138 movl 8(%ebp), %edx 139 sgdt (%edx) 140 leave 141 ret 142 SET_SIZE(rd_gdtr) 143 144 ENTRY_NP(wr_gdtr) 145 pushl %ebp 146 movl %esp, %ebp 147 movl 8(%ebp), %edx 148 lgdt (%edx) 149 jmp 1f 150 nop 151 1: 152 leave 153 ret 154 SET_SIZE(wr_gdtr) 155 156 #endif /* __i386 */ 157 #endif /* __lint */ 158 159 #if defined(__amd64) 160 #if defined(__lint) 161 162 /*ARGSUSED*/ 163 void 164 load_segment_registers(selector_t cs, selector_t fs, selector_t gs, 165 selector_t ss) 166 {} 167 168 selector_t 169 get_cs_register() 170 { return (0); } 171 172 #else /* __lint */ 173 174 /* 175 * loads zero selector for ds and es. 176 */ 177 ENTRY_NP(load_segment_registers) 178 pushq %rbp 179 movq %rsp, %rbp 180 pushq %rdi 181 pushq $.newcs 182 lretq 183 .newcs: 184 /* 185 * zero %ds and %es - they're ignored anyway 186 */ 187 xorl %eax, %eax 188 movw %ax, %ds 189 movw %ax, %es 190 movl %esi, %eax 191 movw %ax, %fs 192 movl %edx, %eax 193 movw %ax, %gs 194 movl %ecx, %eax 195 movw %ax, %ss 196 leave 197 ret 198 SET_SIZE(load_segment_registers) 199 200 ENTRY_NP(get_cs_register) 201 movq $0, %rax 202 movw %cs, %rax 203 ret 204 SET_SIZE(get_cs_register) 205 206 #endif /* __lint */ 207 #elif defined(__i386) 208 209 #if defined(__lint) 210 211 /*ARGSUSED*/ 212 void 213 load_segment_registers( 214 selector_t cs, selector_t ds, selector_t es, 215 selector_t fs, selector_t gs, selector_t ss) 216 {} 217 218 selector_t 219 get_cs_register() 220 { return ((selector_t) 0); } 221 222 #else /* __lint */ 223 224 ENTRY_NP(load_segment_registers) 225 pushl %ebp 226 movl %esp, %ebp 227 228 pushl 0x8(%ebp) 229 pushl $.newcs 230 lret 231 .newcs: 232 movw 0xc(%ebp), %ax 233 movw %ax, %ds 234 movw 0x10(%ebp), %ax 235 movw %ax, %es 236 movw 0x14(%ebp), %ax 237 movw %ax, %fs 238 movw 0x18(%ebp), %ax 239 movw %ax, %gs 240 movw 0x1c(%ebp), %ax 241 movw %ax, %ss 242 leave 243 ret 244 SET_SIZE(load_segment_registers) 245 246 ENTRY_NP(get_cs_register) 247 movl $0, %eax 248 movw %cs, %ax 249 ret 250 SET_SIZE(get_cs_register) 251 252 #endif /* __lint */ 253 #endif /* __i386 */ 254 255 #if defined(__lint) 256 257 /*ARGSUSED*/ 258 void 259 wr_ldtr(selector_t ldtsel) 260 {} 261 262 selector_t 263 rd_ldtr(void) 264 { return (0); } 265 266 #else /* __lint */ 267 268 #if defined(__amd64) 269 270 ENTRY_NP(wr_ldtr) 271 movq %rdi, %rax 272 lldt %ax 273 ret 274 SET_SIZE(wr_ldtr) 275 276 ENTRY_NP(rd_ldtr) 277 xorl %eax, %eax 278 sldt %ax 279 ret 280 SET_SIZE(rd_ldtr) 281 282 #elif defined(__i386) 283 284 ENTRY_NP(wr_ldtr) 285 movw 4(%esp), %ax 286 lldt %ax 287 ret 288 SET_SIZE(wr_ldtr) 289 290 ENTRY_NP(rd_ldtr) 291 xorl %eax, %eax 292 sldt %ax 293 ret 294 SET_SIZE(rd_ldtr) 295 296 #endif /* __i386 */ 297 #endif /* __lint */ 298 299 #if defined(__lint) 300 301 /*ARGSUSED*/ 302 void 303 wr_tsr(selector_t tsssel) 304 {} 305 306 #else /* __lint */ 307 308 #if defined(__amd64) 309 310 ENTRY_NP(wr_tsr) 311 movq %rdi, %rax 312 ltr %ax 313 ret 314 SET_SIZE(wr_tsr) 315 316 #elif defined(__i386) 317 318 ENTRY_NP(wr_tsr) 319 movw 4(%esp), %ax 320 ltr %ax 321 ret 322 SET_SIZE(wr_tsr) 323 324 #endif /* __i386 */ 325 #endif /* __lint */