1*1cd76c75SBen Gras /* $NetBSD: cpufunc.h,v 1.13 2011/09/24 10:32:52 jym Exp $ */ 2*1cd76c75SBen Gras 3*1cd76c75SBen Gras /*- 4*1cd76c75SBen Gras * Copyright (c) 1998, 2007 The NetBSD Foundation, Inc. 5*1cd76c75SBen Gras * All rights reserved. 6*1cd76c75SBen Gras * 7*1cd76c75SBen Gras * This code is derived from software contributed to The NetBSD Foundation 8*1cd76c75SBen Gras * by Charles M. Hannum, and by Andrew Doran. 9*1cd76c75SBen Gras * 10*1cd76c75SBen Gras * Redistribution and use in source and binary forms, with or without 11*1cd76c75SBen Gras * modification, are permitted provided that the following conditions 12*1cd76c75SBen Gras * are met: 13*1cd76c75SBen Gras * 1. Redistributions of source code must retain the above copyright 14*1cd76c75SBen Gras * notice, this list of conditions and the following disclaimer. 15*1cd76c75SBen Gras * 2. Redistributions in binary form must reproduce the above copyright 16*1cd76c75SBen Gras * notice, this list of conditions and the following disclaimer in the 17*1cd76c75SBen Gras * documentation and/or other materials provided with the distribution. 18*1cd76c75SBen Gras * 19*1cd76c75SBen Gras * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20*1cd76c75SBen Gras * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21*1cd76c75SBen Gras * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22*1cd76c75SBen Gras * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23*1cd76c75SBen Gras * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24*1cd76c75SBen Gras * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25*1cd76c75SBen Gras * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26*1cd76c75SBen Gras * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27*1cd76c75SBen Gras * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28*1cd76c75SBen Gras * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29*1cd76c75SBen Gras * POSSIBILITY OF SUCH DAMAGE. 30*1cd76c75SBen Gras */ 31*1cd76c75SBen Gras 32*1cd76c75SBen Gras #ifndef _X86_CPUFUNC_H_ 33*1cd76c75SBen Gras #define _X86_CPUFUNC_H_ 34*1cd76c75SBen Gras 35*1cd76c75SBen Gras /* 36*1cd76c75SBen Gras * Functions to provide access to x86-specific instructions. 37*1cd76c75SBen Gras */ 38*1cd76c75SBen Gras 39*1cd76c75SBen Gras #include <sys/cdefs.h> 40*1cd76c75SBen Gras #include <sys/types.h> 41*1cd76c75SBen Gras 42*1cd76c75SBen Gras #include <machine/segments.h> 43*1cd76c75SBen Gras #include <machine/specialreg.h> 44*1cd76c75SBen Gras 45*1cd76c75SBen Gras #ifdef _KERNEL 46*1cd76c75SBen Gras 47*1cd76c75SBen Gras void x86_pause(void); 48*1cd76c75SBen Gras void x86_lfence(void); 49*1cd76c75SBen Gras void x86_sfence(void); 50*1cd76c75SBen Gras void x86_mfence(void); 51*1cd76c75SBen Gras void x86_flush(void); 52*1cd76c75SBen Gras #ifndef XEN 53*1cd76c75SBen Gras void x86_patch(bool); 54*1cd76c75SBen Gras #endif 55*1cd76c75SBen Gras void invlpg(vaddr_t); 56*1cd76c75SBen Gras void lidt(struct region_descriptor *); 57*1cd76c75SBen Gras void lldt(u_short); 58*1cd76c75SBen Gras void ltr(u_short); 59*1cd76c75SBen Gras void lcr0(u_long); 60*1cd76c75SBen Gras u_long rcr0(void); 61*1cd76c75SBen Gras void lcr2(vaddr_t); 62*1cd76c75SBen Gras vaddr_t rcr2(void); 63*1cd76c75SBen Gras void lcr3(vaddr_t); 64*1cd76c75SBen Gras vaddr_t rcr3(void); 65*1cd76c75SBen Gras void lcr4(vaddr_t); 66*1cd76c75SBen Gras vaddr_t rcr4(void); 67*1cd76c75SBen Gras void lcr8(vaddr_t); 68*1cd76c75SBen Gras vaddr_t rcr8(void); 69*1cd76c75SBen Gras void tlbflush(void); 70*1cd76c75SBen Gras void tlbflushg(void); 71*1cd76c75SBen Gras void dr0(void *, uint32_t, uint32_t, uint32_t); 72*1cd76c75SBen Gras vaddr_t rdr6(void); 73*1cd76c75SBen Gras void ldr6(vaddr_t); 74*1cd76c75SBen Gras void wbinvd(void); 75*1cd76c75SBen Gras void breakpoint(void); 76*1cd76c75SBen Gras void x86_hlt(void); 77*1cd76c75SBen Gras void x86_stihlt(void); 78*1cd76c75SBen Gras u_int x86_getss(void); 79*1cd76c75SBen Gras void fldcw(void *); 80*1cd76c75SBen Gras void fnclex(void); 81*1cd76c75SBen Gras void fninit(void); 82*1cd76c75SBen Gras void fnsave(void *); 83*1cd76c75SBen Gras void fnstcw(void *); 84*1cd76c75SBen Gras void fnstsw(void *); 85*1cd76c75SBen Gras void fp_divide_by_0(void); 86*1cd76c75SBen Gras void frstor(void *); 87*1cd76c75SBen Gras void fwait(void); 88*1cd76c75SBen Gras void clts(void); 89*1cd76c75SBen Gras void stts(void); 90*1cd76c75SBen Gras void fldummy(const double *); 91*1cd76c75SBen Gras void fxsave(void *); 92*1cd76c75SBen Gras void fxrstor(void *); 93*1cd76c75SBen Gras void x86_monitor(const void *, uint32_t, uint32_t); 94*1cd76c75SBen Gras void x86_mwait(uint32_t, uint32_t); 95*1cd76c75SBen Gras void x86_ldmxcsr(void *); 96*1cd76c75SBen Gras #define x86_cpuid(a,b) x86_cpuid2((a),0,(b)) 97*1cd76c75SBen Gras void x86_cpuid2(unsigned, unsigned, unsigned *); 98*1cd76c75SBen Gras 99*1cd76c75SBen Gras /* Use read_psl, write_psl when saving and restoring interrupt state. */ 100*1cd76c75SBen Gras void x86_disable_intr(void); 101*1cd76c75SBen Gras void x86_enable_intr(void); 102*1cd76c75SBen Gras u_long x86_read_psl(void); 103*1cd76c75SBen Gras void x86_write_psl(u_long); 104*1cd76c75SBen Gras 105*1cd76c75SBen Gras /* Use read_flags, write_flags to adjust other members of %eflags. */ 106*1cd76c75SBen Gras u_long x86_read_flags(void); 107*1cd76c75SBen Gras void x86_write_flags(u_long); 108*1cd76c75SBen Gras 109*1cd76c75SBen Gras void x86_reset(void); 110*1cd76c75SBen Gras 111*1cd76c75SBen Gras /* 112*1cd76c75SBen Gras * Some of the undocumented AMD64 MSRs need a 'passcode' to access. 113*1cd76c75SBen Gras * 114*1cd76c75SBen Gras * See LinuxBIOSv2: src/cpu/amd/model_fxx/model_fxx_init.c 115*1cd76c75SBen Gras */ 116*1cd76c75SBen Gras 117*1cd76c75SBen Gras #define OPTERON_MSR_PASSCODE 0x9c5a203aU 118*1cd76c75SBen Gras 119*1cd76c75SBen Gras uint64_t rdmsr(u_int); 120*1cd76c75SBen Gras uint64_t rdmsr_locked(u_int, u_int); 121*1cd76c75SBen Gras int rdmsr_safe(u_int, uint64_t *); 122*1cd76c75SBen Gras uint64_t rdtsc(void); 123*1cd76c75SBen Gras uint64_t rdpmc(u_int); 124*1cd76c75SBen Gras void wrmsr(u_int, uint64_t); 125*1cd76c75SBen Gras void wrmsr_locked(u_int, u_int, uint64_t); 126*1cd76c75SBen Gras void setfs(int); 127*1cd76c75SBen Gras void setusergs(int); 128*1cd76c75SBen Gras 129*1cd76c75SBen Gras #endif /* _KERNEL */ 130*1cd76c75SBen Gras 131*1cd76c75SBen Gras #endif /* !_X86_CPUFUNC_H_ */ 132