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 /*
  23  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 #include <sys/asm_linkage.h>
  28 #include <sys/asm_misc.h>
  29 
  30 #if defined(__lint)
  31 
  32 #include "dboot_asm.h"
  33 
  34 /* ARGSUSED */
  35 uint32_t
  36 get_cpuid_edx(uint32_t *eax)
  37 { return (0); }
  38 
  39 /* ARGSUSED */
  40 void
  41 outb(int port, uint8_t value)
  42 {}
  43 
  44 /* ARGSUSED */
  45 uint8_t
  46 inb(int port)
  47 { return (0); }
  48 
  49 #else /* __lint */
  50 
  51 #if defined(__amd64)
  52 
  53         /*
  54          * do a cpuid instruction, returning the eax/edx values
  55          *
  56          * uint32_t get_cpuid_edx(uint32_t *eax)
  57          */
  58         ENTRY_NP(get_cpuid_edx)
  59         pushq   %rbx
  60         movl    (%rdi), %eax
  61         cpuid
  62         movl    %eax, (%rdi)
  63         movl    %edx, %eax
  64         popq    %rbx
  65         ret
  66         SET_SIZE(get_cpuid_edx)
  67 
  68         /*
  69          * void outb(int port, uint8_t value)
  70          */
  71         ENTRY(outb)
  72         movw    %di, %dx
  73         movb    %sil, %al
  74         outb    (%dx)
  75         ret
  76         SET_SIZE(outb)
  77 
  78         /*
  79          * uint8_t inb(int port)
  80          */
  81         ENTRY(inb)
  82         xorl    %eax, %eax
  83         movw    %di, %dx
  84         inb     (%dx)
  85         ret
  86         SET_SIZE(inb)
  87 
  88         ENTRY(htonl)
  89         movl    %edi, %eax
  90         bswap   %eax
  91         ret
  92         SET_SIZE(htonl)
  93 
  94 #elif defined(__i386)
  95 
  96         .code32
  97 
  98         /*
  99          * do a cpuid instruction, returning the eax/edx values
 100          *
 101          * uint32_t get_cpuid_edx(uint32_t *eax)
 102          */
 103         ENTRY_NP(get_cpuid_edx)
 104         movl    4(%esp), %ecx
 105         movl    (%ecx), %eax
 106         pushl   %ebx
 107         cpuid
 108         popl    %ebx
 109         movl    4(%esp), %ecx
 110         movl    %eax, (%ecx)
 111         movl    %edx, %eax
 112         ret
 113         SET_SIZE(get_cpuid_edx)
 114 
 115         /*
 116          * void outb(int port, uint8_t value)
 117          */
 118         ENTRY_NP(outb)
 119         movl    4(%esp), %edx
 120         movl    8(%esp), %eax
 121         outb    (%dx)
 122         ret
 123         SET_SIZE(outb)
 124 
 125         /*
 126          * uint8_t inb(int port)
 127          */
 128         ENTRY_NP(inb)
 129         movl    4(%esp), %edx
 130         inb     (%dx)
 131         andl    $0xff, %eax
 132         ret
 133         SET_SIZE(inb)
 134 
 135         ENTRY(htonl)
 136         movl    4(%esp), %eax
 137         bswap   %eax
 138         ret
 139         SET_SIZE(htonl)
 140 
 141 #endif  /* __i386 */
 142 
 143 #endif /* __lint */