xref: /titanic_50/usr/src/uts/intel/ia32/ml/desctbls_asm.s (revision 4d4ea8fa1c791525ea6d0a077480434f64d6e7b4)
17c478bd9Sstevel@tonic-gate/*
27c478bd9Sstevel@tonic-gate * CDDL HEADER START
37c478bd9Sstevel@tonic-gate *
47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the
55f9a4ecdSrab * Common Development and Distribution License (the "License").
65f9a4ecdSrab * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate *
87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate * and limitations under the License.
127c478bd9Sstevel@tonic-gate *
137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate *
197c478bd9Sstevel@tonic-gate * CDDL HEADER END
207c478bd9Sstevel@tonic-gate */
217c478bd9Sstevel@tonic-gate/*
22ae115bc7Smrj * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
237c478bd9Sstevel@tonic-gate * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate */
257c478bd9Sstevel@tonic-gate
267c478bd9Sstevel@tonic-gate#include <sys/asm_linkage.h>
277c478bd9Sstevel@tonic-gate#include <sys/asm_misc.h>
287c478bd9Sstevel@tonic-gate#include <sys/regset.h>
297c478bd9Sstevel@tonic-gate#include <sys/panic.h>
307c478bd9Sstevel@tonic-gate#include <sys/ontrap.h>
317c478bd9Sstevel@tonic-gate#include <sys/privregs.h>
327c478bd9Sstevel@tonic-gate#include <sys/segments.h>
33ae115bc7Smrj#include <sys/trap.h>
347c478bd9Sstevel@tonic-gate
357c478bd9Sstevel@tonic-gate#if defined(__lint)
367c478bd9Sstevel@tonic-gate#include <sys/types.h>
377c478bd9Sstevel@tonic-gate#include <sys/systm.h>
387c478bd9Sstevel@tonic-gate#include <sys/thread.h>
397c478bd9Sstevel@tonic-gate#include <sys/archsystm.h>
407c478bd9Sstevel@tonic-gate#include <sys/byteorder.h>
417c478bd9Sstevel@tonic-gate#include <sys/dtrace.h>
427c478bd9Sstevel@tonic-gate#include <sys/x86_archext.h>
437c478bd9Sstevel@tonic-gate#else   /* __lint */
447c478bd9Sstevel@tonic-gate#include "assym.h"
457c478bd9Sstevel@tonic-gate#endif  /* __lint */
467c478bd9Sstevel@tonic-gate
477c478bd9Sstevel@tonic-gate#if defined(__lint)
487c478bd9Sstevel@tonic-gate
497c478bd9Sstevel@tonic-gate/*ARGSUSED*/
50ae115bc7Smrjvoid
51ae115bc7Smrjrd_idtr(desctbr_t *idtr)
527c478bd9Sstevel@tonic-gate{}
537c478bd9Sstevel@tonic-gate
547c478bd9Sstevel@tonic-gate/*ARGSUSED*/
55ae115bc7Smrjvoid
56ae115bc7Smrjwr_idtr(desctbr_t *idtr)
577c478bd9Sstevel@tonic-gate{}
587c478bd9Sstevel@tonic-gate
597c478bd9Sstevel@tonic-gate#else	/* __lint */
607c478bd9Sstevel@tonic-gate
617c478bd9Sstevel@tonic-gate#if defined(__amd64)
627c478bd9Sstevel@tonic-gate
637c478bd9Sstevel@tonic-gate	ENTRY_NP(rd_idtr)
647c478bd9Sstevel@tonic-gate	sidt	(%rdi)
657c478bd9Sstevel@tonic-gate	ret
667c478bd9Sstevel@tonic-gate	SET_SIZE(rd_idtr)
677c478bd9Sstevel@tonic-gate
687c478bd9Sstevel@tonic-gate	ENTRY_NP(wr_idtr)
697c478bd9Sstevel@tonic-gate	lidt	(%rdi)
707c478bd9Sstevel@tonic-gate	ret
717c478bd9Sstevel@tonic-gate	SET_SIZE(wr_idtr)
727c478bd9Sstevel@tonic-gate
737c478bd9Sstevel@tonic-gate#elif defined(__i386)
747c478bd9Sstevel@tonic-gate
757c478bd9Sstevel@tonic-gate	ENTRY_NP(rd_idtr)
767c478bd9Sstevel@tonic-gate	pushl	%ebp
777c478bd9Sstevel@tonic-gate	movl	%esp, %ebp
787c478bd9Sstevel@tonic-gate	movl	8(%ebp), %edx
797c478bd9Sstevel@tonic-gate	sidt	(%edx)
807c478bd9Sstevel@tonic-gate	leave
817c478bd9Sstevel@tonic-gate	ret
827c478bd9Sstevel@tonic-gate	SET_SIZE(rd_idtr)
837c478bd9Sstevel@tonic-gate
847c478bd9Sstevel@tonic-gate	ENTRY_NP(wr_idtr)
857c478bd9Sstevel@tonic-gate	pushl	%ebp
867c478bd9Sstevel@tonic-gate	movl	%esp, %ebp
877c478bd9Sstevel@tonic-gate	movl	8(%ebp), %edx
887c478bd9Sstevel@tonic-gate	lidt	(%edx)
897c478bd9Sstevel@tonic-gate	leave
907c478bd9Sstevel@tonic-gate	ret
917c478bd9Sstevel@tonic-gate	SET_SIZE(wr_idtr)
927c478bd9Sstevel@tonic-gate
937c478bd9Sstevel@tonic-gate#endif	/* __i386 */
947c478bd9Sstevel@tonic-gate#endif	/* __lint */
957c478bd9Sstevel@tonic-gate
967c478bd9Sstevel@tonic-gate#if defined(__lint)
977c478bd9Sstevel@tonic-gate
987c478bd9Sstevel@tonic-gate/*ARGSUSED*/
99ae115bc7Smrjvoid
100ae115bc7Smrjrd_gdtr(desctbr_t *gdtr)
1017c478bd9Sstevel@tonic-gate{}
1027c478bd9Sstevel@tonic-gate
1037c478bd9Sstevel@tonic-gate/*ARGSUSED*/
104ae115bc7Smrjvoid
105ae115bc7Smrjwr_gdtr(desctbr_t *gdtr)
1067c478bd9Sstevel@tonic-gate{}
1077c478bd9Sstevel@tonic-gate
1087c478bd9Sstevel@tonic-gate#else	/* __lint */
1097c478bd9Sstevel@tonic-gate
1107c478bd9Sstevel@tonic-gate#if defined(__amd64)
1117c478bd9Sstevel@tonic-gate
1127c478bd9Sstevel@tonic-gate	ENTRY_NP(rd_gdtr)
113ae115bc7Smrj	pushq	%rbp
114ae115bc7Smrj	movq	%rsp, %rbp
1157c478bd9Sstevel@tonic-gate	sgdt	(%rdi)
116ae115bc7Smrj	leave
1177c478bd9Sstevel@tonic-gate	ret
1187c478bd9Sstevel@tonic-gate	SET_SIZE(rd_gdtr)
1197c478bd9Sstevel@tonic-gate
1207c478bd9Sstevel@tonic-gate	ENTRY_NP(wr_gdtr)
121ae115bc7Smrj	pushq	%rbp
122ae115bc7Smrj	movq	%rsp, %rbp
1237c478bd9Sstevel@tonic-gate	lgdt	(%rdi)
1247c478bd9Sstevel@tonic-gate	jmp	1f
1257c478bd9Sstevel@tonic-gate	nop
1267c478bd9Sstevel@tonic-gate1:
127ae115bc7Smrj	leave
128ae115bc7Smrj	ret
1297c478bd9Sstevel@tonic-gate	SET_SIZE(wr_gdtr)
1307c478bd9Sstevel@tonic-gate
1317c478bd9Sstevel@tonic-gate#elif defined(__i386)
1327c478bd9Sstevel@tonic-gate
1337c478bd9Sstevel@tonic-gate	ENTRY_NP(rd_gdtr)
1347c478bd9Sstevel@tonic-gate	pushl	%ebp
1357c478bd9Sstevel@tonic-gate	movl	%esp, %ebp
1367c478bd9Sstevel@tonic-gate	movl	8(%ebp), %edx
1377c478bd9Sstevel@tonic-gate	sgdt	(%edx)
1387c478bd9Sstevel@tonic-gate	leave
1397c478bd9Sstevel@tonic-gate	ret
1407c478bd9Sstevel@tonic-gate	SET_SIZE(rd_gdtr)
1417c478bd9Sstevel@tonic-gate
1427c478bd9Sstevel@tonic-gate	ENTRY_NP(wr_gdtr)
1437c478bd9Sstevel@tonic-gate	pushl	%ebp
1447c478bd9Sstevel@tonic-gate	movl	%esp, %ebp
1457c478bd9Sstevel@tonic-gate	movl	8(%ebp), %edx
1467c478bd9Sstevel@tonic-gate	lgdt	(%edx)
147ae115bc7Smrj	jmp	1f
1487c478bd9Sstevel@tonic-gate	nop
149ae115bc7Smrj1:
1507c478bd9Sstevel@tonic-gate	leave
1517c478bd9Sstevel@tonic-gate	ret
1527c478bd9Sstevel@tonic-gate	SET_SIZE(wr_gdtr)
1537c478bd9Sstevel@tonic-gate
1547c478bd9Sstevel@tonic-gate#endif	/* __i386 */
1557c478bd9Sstevel@tonic-gate#endif	/* __lint */
1567c478bd9Sstevel@tonic-gate
157ae115bc7Smrj#if defined(__amd64)
1587c478bd9Sstevel@tonic-gate#if defined(__lint)
1597c478bd9Sstevel@tonic-gate
1607c478bd9Sstevel@tonic-gate/*ARGSUSED*/
161ae115bc7Smrjvoid
162ae115bc7Smrjload_segment_registers(selector_t cs, selector_t fs, selector_t gs,
163ae115bc7Smrj    selector_t ss)
1647c478bd9Sstevel@tonic-gate{}
1657c478bd9Sstevel@tonic-gate
166843e1988Sjohnlevselector_t
167843e1988Sjohnlevget_cs_register()
168843e1988Sjohnlev{ return (0); }
169843e1988Sjohnlev
170ae115bc7Smrj#else	/* __lint */
171ae115bc7Smrj
172ae115bc7Smrj	/*
173ae115bc7Smrj	 * loads zero selector for ds and es.
174ae115bc7Smrj	 */
175ae115bc7Smrj	ENTRY_NP(load_segment_registers)
176ae115bc7Smrj	pushq	%rbp
177ae115bc7Smrj	movq	%rsp, %rbp
178ae115bc7Smrj	pushq	%rdi
179ae115bc7Smrj	pushq	$.newcs
180ae115bc7Smrj	lretq
181ae115bc7Smrj.newcs:
182ae115bc7Smrj	/*
183ae115bc7Smrj	 * zero %ds and %es - they're ignored anyway
184ae115bc7Smrj	 */
185ae115bc7Smrj	xorl	%eax, %eax
186ae115bc7Smrj	movw	%ax, %ds
187ae115bc7Smrj	movw	%ax, %es
188ae115bc7Smrj	movl	%esi, %eax
189ae115bc7Smrj	movw	%ax, %fs
190ae115bc7Smrj	movl	%edx, %eax
191ae115bc7Smrj	movw	%ax, %gs
192ae115bc7Smrj	movl	%ecx, %eax
193ae115bc7Smrj	movw	%ax, %ss
194ae115bc7Smrj	leave
195ae115bc7Smrj	ret
196ae115bc7Smrj	SET_SIZE(load_segment_registers)
197ae115bc7Smrj
198843e1988Sjohnlev	ENTRY_NP(get_cs_register)
199*4d4ea8faSIgor Kozhukhov	movq	%cs, %rax
200843e1988Sjohnlev	ret
201843e1988Sjohnlev	SET_SIZE(get_cs_register)
202843e1988Sjohnlev
203ae115bc7Smrj#endif	/* __lint */
204ae115bc7Smrj#elif defined(__i386)
205ae115bc7Smrj
206ae115bc7Smrj#if defined(__lint)
207ae115bc7Smrj
208ae115bc7Smrj/*ARGSUSED*/
209ae115bc7Smrjvoid
210ae115bc7Smrjload_segment_registers(
211ae115bc7Smrj    selector_t cs, selector_t ds, selector_t es,
212ae115bc7Smrj    selector_t fs, selector_t gs, selector_t ss)
213ae115bc7Smrj{}
214ae115bc7Smrj
215843e1988Sjohnlevselector_t
216843e1988Sjohnlevget_cs_register()
217843e1988Sjohnlev{ return ((selector_t) 0); }
218843e1988Sjohnlev
219ae115bc7Smrj#else	/* __lint */
220ae115bc7Smrj
221ae115bc7Smrj	ENTRY_NP(load_segment_registers)
222ae115bc7Smrj	pushl	%ebp
223ae115bc7Smrj	movl	%esp, %ebp
224ae115bc7Smrj
225ae115bc7Smrj	pushl	0x8(%ebp)
226ae115bc7Smrj	pushl	$.newcs
227ae115bc7Smrj	lret
228ae115bc7Smrj.newcs:
229ae115bc7Smrj	movw	0xc(%ebp), %ax
230ae115bc7Smrj	movw	%ax, %ds
231ae115bc7Smrj	movw	0x10(%ebp), %ax
232ae115bc7Smrj	movw	%ax, %es
233ae115bc7Smrj	movw	0x14(%ebp), %ax
234ae115bc7Smrj	movw	%ax, %fs
235ae115bc7Smrj	movw	0x18(%ebp), %ax
236ae115bc7Smrj	movw	%ax, %gs
237ae115bc7Smrj	movw	0x1c(%ebp), %ax
238ae115bc7Smrj	movw	%ax, %ss
239ae115bc7Smrj	leave
240ae115bc7Smrj	ret
241ae115bc7Smrj	SET_SIZE(load_segment_registers)
242ae115bc7Smrj
243843e1988Sjohnlev	ENTRY_NP(get_cs_register)
244843e1988Sjohnlev	movl	$0, %eax
245843e1988Sjohnlev	movw	%cs, %ax
246843e1988Sjohnlev	ret
247843e1988Sjohnlev	SET_SIZE(get_cs_register)
248843e1988Sjohnlev
249ae115bc7Smrj#endif	/* __lint */
250ae115bc7Smrj#endif	/* __i386 */
251ae115bc7Smrj
252ae115bc7Smrj#if defined(__lint)
253ae115bc7Smrj
254ae115bc7Smrj/*ARGSUSED*/
255ae115bc7Smrjvoid
256ae115bc7Smrjwr_ldtr(selector_t ldtsel)
257ae115bc7Smrj{}
258ae115bc7Smrj
259ae115bc7Smrjselector_t
260ae115bc7Smrjrd_ldtr(void)
2617c478bd9Sstevel@tonic-gate{ return (0); }
2627c478bd9Sstevel@tonic-gate
2637c478bd9Sstevel@tonic-gate#else	/* __lint */
2647c478bd9Sstevel@tonic-gate
2657c478bd9Sstevel@tonic-gate#if defined(__amd64)
2667c478bd9Sstevel@tonic-gate
2677c478bd9Sstevel@tonic-gate	ENTRY_NP(wr_ldtr)
2687c478bd9Sstevel@tonic-gate	movq	%rdi, %rax
2697c478bd9Sstevel@tonic-gate	lldt	%ax
2707c478bd9Sstevel@tonic-gate	ret
2717c478bd9Sstevel@tonic-gate	SET_SIZE(wr_ldtr)
2727c478bd9Sstevel@tonic-gate
2737c478bd9Sstevel@tonic-gate	ENTRY_NP(rd_ldtr)
2747c478bd9Sstevel@tonic-gate	xorl	%eax, %eax
2757c478bd9Sstevel@tonic-gate	sldt	%ax
2767c478bd9Sstevel@tonic-gate	ret
2777c478bd9Sstevel@tonic-gate	SET_SIZE(rd_ldtr)
2787c478bd9Sstevel@tonic-gate
2797c478bd9Sstevel@tonic-gate#elif defined(__i386)
2807c478bd9Sstevel@tonic-gate
2817c478bd9Sstevel@tonic-gate	ENTRY_NP(wr_ldtr)
2827c478bd9Sstevel@tonic-gate	movw	4(%esp), %ax
2837c478bd9Sstevel@tonic-gate	lldt	%ax
2847c478bd9Sstevel@tonic-gate	ret
2857c478bd9Sstevel@tonic-gate	SET_SIZE(wr_ldtr)
2867c478bd9Sstevel@tonic-gate
2877c478bd9Sstevel@tonic-gate	ENTRY_NP(rd_ldtr)
2887c478bd9Sstevel@tonic-gate	xorl	%eax, %eax
2897c478bd9Sstevel@tonic-gate	sldt	%ax
2907c478bd9Sstevel@tonic-gate	ret
2917c478bd9Sstevel@tonic-gate	SET_SIZE(rd_ldtr)
2927c478bd9Sstevel@tonic-gate
2937c478bd9Sstevel@tonic-gate#endif	/* __i386 */
2947c478bd9Sstevel@tonic-gate#endif	/* __lint */
2957c478bd9Sstevel@tonic-gate
2967c478bd9Sstevel@tonic-gate#if defined(__lint)
2977c478bd9Sstevel@tonic-gate
2987c478bd9Sstevel@tonic-gate/*ARGSUSED*/
299ae115bc7Smrjvoid
300ae115bc7Smrjwr_tsr(selector_t tsssel)
3017c478bd9Sstevel@tonic-gate{}
3027c478bd9Sstevel@tonic-gate
3037c478bd9Sstevel@tonic-gate#else	/* __lint */
3047c478bd9Sstevel@tonic-gate
3057c478bd9Sstevel@tonic-gate#if defined(__amd64)
3067c478bd9Sstevel@tonic-gate
3077c478bd9Sstevel@tonic-gate	ENTRY_NP(wr_tsr)
3087c478bd9Sstevel@tonic-gate	movq	%rdi, %rax
3097c478bd9Sstevel@tonic-gate	ltr	%ax
3107c478bd9Sstevel@tonic-gate	ret
3117c478bd9Sstevel@tonic-gate	SET_SIZE(wr_tsr)
3127c478bd9Sstevel@tonic-gate
3137c478bd9Sstevel@tonic-gate#elif defined(__i386)
3147c478bd9Sstevel@tonic-gate
3157c478bd9Sstevel@tonic-gate	ENTRY_NP(wr_tsr)
3167c478bd9Sstevel@tonic-gate	movw	4(%esp), %ax
3177c478bd9Sstevel@tonic-gate	ltr	%ax
3187c478bd9Sstevel@tonic-gate	ret
3197c478bd9Sstevel@tonic-gate	SET_SIZE(wr_tsr)
3207c478bd9Sstevel@tonic-gate
3217c478bd9Sstevel@tonic-gate#endif	/* __i386 */
3227c478bd9Sstevel@tonic-gate#endif	/* __lint */
323