1*095593c0SStefan Reinauer /* 2*095593c0SStefan Reinauer * Copyright (c) 2012 The Chromium OS Authors. 3*095593c0SStefan Reinauer * 4*095593c0SStefan Reinauer * (C) Copyright 2008-2011 5*095593c0SStefan Reinauer * Graeme Russ, <graeme.russ@gmail.com> 6*095593c0SStefan Reinauer * 7*095593c0SStefan Reinauer * (C) Copyright 2002 8*095593c0SStefan Reinauer * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se> 9*095593c0SStefan Reinauer * 10*095593c0SStefan Reinauer * Portions of this file are derived from the Linux kernel source 11*095593c0SStefan Reinauer * Copyright (C) 1991, 1992 Linus Torvalds 12*095593c0SStefan Reinauer * 13*095593c0SStefan Reinauer * See file CREDITS for list of people who contributed to this 14*095593c0SStefan Reinauer * project. 15*095593c0SStefan Reinauer * 16*095593c0SStefan Reinauer * This program is free software; you can redistribute it and/or 17*095593c0SStefan Reinauer * modify it under the terms of the GNU General Public License as 18*095593c0SStefan Reinauer * published by the Free Software Foundation; either version 2 of 19*095593c0SStefan Reinauer * the License, or (at your option) any later version. 20*095593c0SStefan Reinauer * 21*095593c0SStefan Reinauer * This program is distributed in the hope that it will be useful, 22*095593c0SStefan Reinauer * but WITHOUT ANY WARRANTY; without even the implied warranty of 23*095593c0SStefan Reinauer * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 24*095593c0SStefan Reinauer * GNU General Public License for more details. 25*095593c0SStefan Reinauer * 26*095593c0SStefan Reinauer * You should have received a copy of the GNU General Public License 27*095593c0SStefan Reinauer * along with this program; if not, write to the Free Software 28*095593c0SStefan Reinauer * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 29*095593c0SStefan Reinauer * MA 02111-1307 USA 30*095593c0SStefan Reinauer */ 31*095593c0SStefan Reinauer 32*095593c0SStefan Reinauer #ifndef __X86_CONTROL_REGS_H 33*095593c0SStefan Reinauer #define __X86_CONTROL_REGS_H 34*095593c0SStefan Reinauer 35*095593c0SStefan Reinauer /* 36*095593c0SStefan Reinauer * The memory clobber prevents the GCC from reordering the read/write order 37*095593c0SStefan Reinauer * of CR0 38*095593c0SStefan Reinauer */ 39*095593c0SStefan Reinauer static inline unsigned long read_cr0(void) 40*095593c0SStefan Reinauer { 41*095593c0SStefan Reinauer unsigned long val; 42*095593c0SStefan Reinauer 43*095593c0SStefan Reinauer asm volatile ("movl %%cr0, %0" : "=r" (val) : : "memory"); 44*095593c0SStefan Reinauer return val; 45*095593c0SStefan Reinauer } 46*095593c0SStefan Reinauer 47*095593c0SStefan Reinauer static inline void write_cr0(unsigned long val) 48*095593c0SStefan Reinauer { 49*095593c0SStefan Reinauer asm volatile ("movl %0, %%cr0" : : "r" (val) : "memory"); 50*095593c0SStefan Reinauer } 51*095593c0SStefan Reinauer 52*095593c0SStefan Reinauer static inline unsigned long read_cr2(void) 53*095593c0SStefan Reinauer { 54*095593c0SStefan Reinauer unsigned long val; 55*095593c0SStefan Reinauer 56*095593c0SStefan Reinauer asm volatile("mov %%cr2,%0\n\t" : "=r" (val) : : "memory"); 57*095593c0SStefan Reinauer return val; 58*095593c0SStefan Reinauer } 59*095593c0SStefan Reinauer 60*095593c0SStefan Reinauer static inline unsigned long read_cr3(void) 61*095593c0SStefan Reinauer { 62*095593c0SStefan Reinauer unsigned long val; 63*095593c0SStefan Reinauer 64*095593c0SStefan Reinauer asm volatile("mov %%cr3,%0\n\t" : "=r" (val) : : "memory"); 65*095593c0SStefan Reinauer return val; 66*095593c0SStefan Reinauer } 67*095593c0SStefan Reinauer 68*095593c0SStefan Reinauer static inline unsigned long read_cr4(void) 69*095593c0SStefan Reinauer { 70*095593c0SStefan Reinauer unsigned long val; 71*095593c0SStefan Reinauer 72*095593c0SStefan Reinauer asm volatile("mov %%cr4,%0\n\t" : "=r" (val) : : "memory"); 73*095593c0SStefan Reinauer return val; 74*095593c0SStefan Reinauer } 75*095593c0SStefan Reinauer 76*095593c0SStefan Reinauer static inline unsigned long get_debugreg(int regno) 77*095593c0SStefan Reinauer { 78*095593c0SStefan Reinauer unsigned long val = 0; /* Damn you, gcc! */ 79*095593c0SStefan Reinauer 80*095593c0SStefan Reinauer switch (regno) { 81*095593c0SStefan Reinauer case 0: 82*095593c0SStefan Reinauer asm("mov %%db0, %0" : "=r" (val)); 83*095593c0SStefan Reinauer break; 84*095593c0SStefan Reinauer case 1: 85*095593c0SStefan Reinauer asm("mov %%db1, %0" : "=r" (val)); 86*095593c0SStefan Reinauer break; 87*095593c0SStefan Reinauer case 2: 88*095593c0SStefan Reinauer asm("mov %%db2, %0" : "=r" (val)); 89*095593c0SStefan Reinauer break; 90*095593c0SStefan Reinauer case 3: 91*095593c0SStefan Reinauer asm("mov %%db3, %0" : "=r" (val)); 92*095593c0SStefan Reinauer break; 93*095593c0SStefan Reinauer case 6: 94*095593c0SStefan Reinauer asm("mov %%db6, %0" : "=r" (val)); 95*095593c0SStefan Reinauer break; 96*095593c0SStefan Reinauer case 7: 97*095593c0SStefan Reinauer asm("mov %%db7, %0" : "=r" (val)); 98*095593c0SStefan Reinauer break; 99*095593c0SStefan Reinauer default: 100*095593c0SStefan Reinauer val = 0; 101*095593c0SStefan Reinauer } 102*095593c0SStefan Reinauer return val; 103*095593c0SStefan Reinauer } 104*095593c0SStefan Reinauer 105*095593c0SStefan Reinauer #endif 106