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
57c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only
67c478bd9Sstevel@tonic-gate * (the "License").  You may not use this file except in compliance
77c478bd9Sstevel@tonic-gate * with the License.
87c478bd9Sstevel@tonic-gate *
97c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate * and limitations under the License.
137c478bd9Sstevel@tonic-gate *
147c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate *
207c478bd9Sstevel@tonic-gate * CDDL HEADER END
217c478bd9Sstevel@tonic-gate */
227c478bd9Sstevel@tonic-gate/*
237c478bd9Sstevel@tonic-gate * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
247c478bd9Sstevel@tonic-gate * Use is subject to license terms.
257c478bd9Sstevel@tonic-gate */
267c478bd9Sstevel@tonic-gate
277c478bd9Sstevel@tonic-gate#if defined(__lint)
287c478bd9Sstevel@tonic-gate#include <kmdb/kmdb_asmutil.h>
297c478bd9Sstevel@tonic-gate#endif
307c478bd9Sstevel@tonic-gate
317c478bd9Sstevel@tonic-gate#include <sys/asm_linkage.h>
327c478bd9Sstevel@tonic-gate
337c478bd9Sstevel@tonic-gate#if defined(__lint)
347c478bd9Sstevel@tonic-gate/*ARGSUSED*/
357c478bd9Sstevel@tonic-gateuintptr_t
367c478bd9Sstevel@tonic-gatecas(uintptr_t *rs1, uintptr_t rs2, uintptr_t rd)
377c478bd9Sstevel@tonic-gate{
387c478bd9Sstevel@tonic-gate	return (0);
397c478bd9Sstevel@tonic-gate}
407c478bd9Sstevel@tonic-gate#else
417c478bd9Sstevel@tonic-gate
427c478bd9Sstevel@tonic-gate	ENTRY_NP(cas)
437c478bd9Sstevel@tonic-gate	movq	%rsi, %rax
447c478bd9Sstevel@tonic-gate	lock
457c478bd9Sstevel@tonic-gate	  cmpxchgq %rdx, (%rdi)
467c478bd9Sstevel@tonic-gate	ret
477c478bd9Sstevel@tonic-gate	SET_SIZE(cas)
487c478bd9Sstevel@tonic-gate#endif
497c478bd9Sstevel@tonic-gate
507c478bd9Sstevel@tonic-gate#if defined(__lint)
517c478bd9Sstevel@tonic-gatevoid
527c478bd9Sstevel@tonic-gatemembar_producer(void)
537c478bd9Sstevel@tonic-gate{
547c478bd9Sstevel@tonic-gate}
557c478bd9Sstevel@tonic-gate#else
567c478bd9Sstevel@tonic-gate
577c478bd9Sstevel@tonic-gate	ENTRY(membar_producer)
587c478bd9Sstevel@tonic-gate	sfence
597c478bd9Sstevel@tonic-gate	ret
607c478bd9Sstevel@tonic-gate	SET_SIZE(membar_producer)
617c478bd9Sstevel@tonic-gate
627c478bd9Sstevel@tonic-gate#endif
637c478bd9Sstevel@tonic-gate
647c478bd9Sstevel@tonic-gate#if defined(__lint)
657c478bd9Sstevel@tonic-gate/*ARGSUSED*/
667c478bd9Sstevel@tonic-gatevoid
677c478bd9Sstevel@tonic-gaterdmsr(uint32_t addr, uint64_t *retp)
687c478bd9Sstevel@tonic-gate{
697c478bd9Sstevel@tonic-gate}
707c478bd9Sstevel@tonic-gate#else
717c478bd9Sstevel@tonic-gate
727c478bd9Sstevel@tonic-gate	ENTRY(rdmsr)
737c478bd9Sstevel@tonic-gate	movl	%edi, %ecx
747c478bd9Sstevel@tonic-gate	rdmsr
757c478bd9Sstevel@tonic-gate	movl	%eax, (%rsi)
767c478bd9Sstevel@tonic-gate	movl	%edx, 4(%rsi)
777c478bd9Sstevel@tonic-gate	ret
787c478bd9Sstevel@tonic-gate	SET_SIZE(rdmsr)
797c478bd9Sstevel@tonic-gate
807c478bd9Sstevel@tonic-gate#endif
817c478bd9Sstevel@tonic-gate
827c478bd9Sstevel@tonic-gate#if defined(__lint)
837c478bd9Sstevel@tonic-gate/*ARGSUSED*/
847c478bd9Sstevel@tonic-gatevoid
857c478bd9Sstevel@tonic-gatewrmsr(uint32_t addr, uint64_t *valp)
867c478bd9Sstevel@tonic-gate{
877c478bd9Sstevel@tonic-gate}
887c478bd9Sstevel@tonic-gate#else
897c478bd9Sstevel@tonic-gate
907c478bd9Sstevel@tonic-gate	ENTRY(wrmsr)
917c478bd9Sstevel@tonic-gate	movl	(%rsi), %eax
927c478bd9Sstevel@tonic-gate	movl	4(%rsi), %edx
937c478bd9Sstevel@tonic-gate	movl	%edi, %ecx
947c478bd9Sstevel@tonic-gate	wrmsr
957c478bd9Sstevel@tonic-gate	ret
967c478bd9Sstevel@tonic-gate	SET_SIZE(wrmsr)
977c478bd9Sstevel@tonic-gate
987c478bd9Sstevel@tonic-gate#endif
997c478bd9Sstevel@tonic-gate
1007c478bd9Sstevel@tonic-gate#if defined(__lint)
1017c478bd9Sstevel@tonic-gateuintptr_t
1027c478bd9Sstevel@tonic-gateget_fp(void)
1037c478bd9Sstevel@tonic-gate{
1047c478bd9Sstevel@tonic-gate	return (0);
1057c478bd9Sstevel@tonic-gate}
1067c478bd9Sstevel@tonic-gate#else
1077c478bd9Sstevel@tonic-gate
1087c478bd9Sstevel@tonic-gate	ENTRY(get_fp)
1097c478bd9Sstevel@tonic-gate	movq	%rbp, %rax
1107c478bd9Sstevel@tonic-gate	ret
1117c478bd9Sstevel@tonic-gate	SET_SIZE(get_fp)
1127c478bd9Sstevel@tonic-gate
1137c478bd9Sstevel@tonic-gate#endif
1147c478bd9Sstevel@tonic-gate
1157c478bd9Sstevel@tonic-gate#if defined(__lint)
1167c478bd9Sstevel@tonic-gate/*ARGSUSED*/
1177c478bd9Sstevel@tonic-gatevoid
1187c478bd9Sstevel@tonic-gatekmt_in(void *buf, size_t nbytes, uintptr_t addr)
1197c478bd9Sstevel@tonic-gate{
1207c478bd9Sstevel@tonic-gate}
1217c478bd9Sstevel@tonic-gate
1227c478bd9Sstevel@tonic-gate/*ARGSUSED*/
1237c478bd9Sstevel@tonic-gatevoid
1247c478bd9Sstevel@tonic-gatekmt_out(void *buf, size_t nbytes, uintptr_t addr)
1257c478bd9Sstevel@tonic-gate{
1267c478bd9Sstevel@tonic-gate}
1277c478bd9Sstevel@tonic-gate#else
1287c478bd9Sstevel@tonic-gate
1297c478bd9Sstevel@tonic-gate	ENTRY_NP(kmt_in)
1307c478bd9Sstevel@tonic-gate	cmpq	$4, %rsi
1312a8bcb4eSToomas Soome	je	4f
1327c478bd9Sstevel@tonic-gate	cmpq	$2, %rsi
1337c478bd9Sstevel@tonic-gate	je	2f
1347c478bd9Sstevel@tonic-gate
1357c478bd9Sstevel@tonic-gate1:	inb	(%dx)
1367c478bd9Sstevel@tonic-gate	movb	%al, 0(%rdi)
1377c478bd9Sstevel@tonic-gate	ret
1387c478bd9Sstevel@tonic-gate
1397c478bd9Sstevel@tonic-gate2:	inw	(%dx)
1407c478bd9Sstevel@tonic-gate	movw	%ax, 0(%rdi)
1417c478bd9Sstevel@tonic-gate	ret
1427c478bd9Sstevel@tonic-gate
1437c478bd9Sstevel@tonic-gate4:	inl	(%dx)
1447c478bd9Sstevel@tonic-gate	movl	%eax, 0(%rdi)
1457c478bd9Sstevel@tonic-gate	ret
1467c478bd9Sstevel@tonic-gate	SET_SIZE(kmt_in)
1477c478bd9Sstevel@tonic-gate
1487c478bd9Sstevel@tonic-gate	ENTRY_NP(kmt_out)
1497c478bd9Sstevel@tonic-gate	cmpq	$4, %rsi
1507c478bd9Sstevel@tonic-gate	je	4f
1517c478bd9Sstevel@tonic-gate	cmpq	$2, %rsi
1527c478bd9Sstevel@tonic-gate	je	2f
1537c478bd9Sstevel@tonic-gate
1547c478bd9Sstevel@tonic-gate1:	movb	0(%rdi), %al
1557c478bd9Sstevel@tonic-gate	outb	(%dx)
1567c478bd9Sstevel@tonic-gate	ret
1577c478bd9Sstevel@tonic-gate
1587c478bd9Sstevel@tonic-gate2:	movw	0(%rdi), %ax
1597c478bd9Sstevel@tonic-gate	outw	(%dx)
1607c478bd9Sstevel@tonic-gate	ret
1617c478bd9Sstevel@tonic-gate
1627c478bd9Sstevel@tonic-gate4:	movl	0(%rdi), %eax
1637c478bd9Sstevel@tonic-gate	outl	(%dx)
1647c478bd9Sstevel@tonic-gate	ret
1657c478bd9Sstevel@tonic-gate	SET_SIZE(kmt_out)
1667c478bd9Sstevel@tonic-gate
1677c478bd9Sstevel@tonic-gate#endif
168