Home | History | Annotate | Download | only in ml
      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 2009 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 
     28 /
     29 / Inline functions specific to the i86pc kernel running on bare metal.
     30 /
     31 
     32 /
     33 / return value of cr3 register
     34 /
     35 	.inline	getcr3,0
     36 	movq	%cr3, %rax
     37 	.end
     38 
     39 /
     40 / reload cr3 register with its current value
     41 /
     42 	.inline	reload_cr3,0
     43 	movq	%cr3, %rdi
     44 	movq	%rdi, %cr3
     45 	.end
     46 
     47 /
     48 / set cr3 register with new value
     49 /
     50 	.inline	setcr3,0
     51 	movq	%rdi, %cr3
     52 	.end
     53 
     54 /
     55 / return value of cr8 register
     56 /
     57 	.inline	getcr8,0
     58 	movq	%cr8, %rax
     59 	.end
     60 
     61 /
     62 / set cr8 register
     63 /
     64 	.inline	setcr8,0
     65 	movq	%rdi, %cr8
     66 	.end
     67 
     68 /
     69 / enable interrupts
     70 /
     71 	.inline	sti,0
     72 	sti
     73 	.end
     74 
     75 /
     76 / disable interrupts
     77 /
     78 	.inline cli,0
     79 	cli
     80 	.end
     81 
     82 /
     83 / disable interrupts and return value describing if interrupts were enabled
     84 /
     85 	.inline	clear_int_flag,0
     86 	pushfq
     87 	cli
     88 	popq	%rax
     89 	.end
     90 
     91 	.inline	intr_clear,0
     92 	pushfq
     93 	cli
     94 	popq	%rax
     95 	.end
     96 
     97 /
     98 / return the value of the flags register
     99 /
    100 	.inline	getflags,0
    101 	pushfq
    102 	popq	%rax
    103 	.end
    104 
    105 /
    106 / restore interrupt enable flag to value returned from 'clear_int_flag' above
    107 /
    108 	.inline restore_int_flag,4
    109 	testq	$0x200, %rdi
    110 	jz	1f
    111 	sti
    112 1:
    113 	.end
    114 
    115 	.inline intr_restore,4
    116 	testq	$0x200, %rdi
    117 	jz	1f
    118 	sti
    119 1:
    120 	.end
    121 
    122 /
    123 / in and out
    124 /
    125 	.inline	inb,4
    126 	movq	%rdi, %rdx
    127 	xorq    %rax, %rax
    128 	inb	(%dx)
    129 	.end
    130 
    131 	.inline	inw,4
    132 	movq	%rdi, %rdx
    133 	xorq    %rax, %rax
    134 	inw	(%dx)
    135 	.end
    136 
    137 	.inline	inl,4
    138 	movq	%rdi, %rdx
    139 	xorq    %rax, %rax
    140 	inl	(%dx)
    141 	.end
    142 
    143 	.inline	outb,8
    144 	movq	%rdi, %rdx
    145 	movq	%rsi, %rax
    146 	outb	(%dx)
    147 	.end
    148 
    149 	.inline	outw,8
    150 	movq	%rdi, %rdx
    151 	movq	%rsi, %rax
    152 	outw	(%dx)
    153 	.end
    154 
    155 	.inline	outl,8
    156 	movq	%rdi, %rdx
    157 	movq	%rsi, %rax
    158 	outl	(%dx)
    159 	.end
    160 
    161 /*
    162  * Call the halt instruction. This will put the CPU to sleep until
    163  * it is again awoken via an interrupt.
    164  * This function should be called with interrupts already disabled
    165  * for the CPU.
    166  * Note that "sti" will only enable interrupts at the end of the
    167  * subsequent instruction...in this case: "hlt".
    168  */
    169 	.inline i86_halt,0
    170 	sti
    171 	hlt
    172 	.end
    173 /
    174 / execute the bsrw instruction
    175 /
    176 	.inline bsrw_insn,4
    177 	xorl	%eax, %eax
    178 	bsrw	%di, %ax
    179 	.end
    180