Home | History | Annotate | Download | only in asm
      1 /* SPDX-License-Identifier: GPL-2.0+ */
      2 /*
      3  * Copyright (c) 2012 The Chromium OS Authors.
      4  *
      5  * (C) Copyright 2008-2011
      6  * Graeme Russ, <graeme.russ (at) gmail.com>
      7  *
      8  * (C) Copyright 2002
      9  * Daniel Engstrm, Omicron Ceti AB, <daniel (at) omicron.se>
     10  *
     11  * Portions of this file are derived from the Linux kernel source
     12  *  Copyright (C) 1991, 1992  Linus Torvalds
     13  */
     14 
     15 #ifndef __X86_CONTROL_REGS_H
     16 #define __X86_CONTROL_REGS_H
     17 
     18 /*
     19  * The memory clobber prevents the GCC from reordering the read/write order
     20  * of CR0
     21 */
     22 static inline unsigned long read_cr0(void)
     23 {
     24 	unsigned long val;
     25 
     26 	asm volatile ("movl %%cr0, %0" : "=r" (val) : : "memory");
     27 	return val;
     28 }
     29 
     30 static inline void write_cr0(unsigned long val)
     31 {
     32 	asm volatile ("movl %0, %%cr0" : : "r" (val) : "memory");
     33 }
     34 
     35 static inline unsigned long read_cr2(void)
     36 {
     37 	unsigned long val;
     38 
     39 	asm volatile("mov %%cr2,%0\n\t" : "=r" (val) : : "memory");
     40 	return val;
     41 }
     42 
     43 static inline unsigned long read_cr3(void)
     44 {
     45 	unsigned long val;
     46 
     47 	asm volatile("mov %%cr3,%0\n\t" : "=r" (val) : : "memory");
     48 	return val;
     49 }
     50 
     51 static inline unsigned long read_cr4(void)
     52 {
     53 	unsigned long val;
     54 
     55 	asm volatile("mov %%cr4,%0\n\t" : "=r" (val) : : "memory");
     56 	return val;
     57 }
     58 
     59 static inline unsigned long get_debugreg(int regno)
     60 {
     61 	unsigned long val = 0;  /* Damn you, gcc! */
     62 
     63 	switch (regno) {
     64 	case 0:
     65 		asm("mov %%db0, %0" : "=r" (val));
     66 		break;
     67 	case 1:
     68 		asm("mov %%db1, %0" : "=r" (val));
     69 		break;
     70 	case 2:
     71 		asm("mov %%db2, %0" : "=r" (val));
     72 		break;
     73 	case 3:
     74 		asm("mov %%db3, %0" : "=r" (val));
     75 		break;
     76 	case 6:
     77 		asm("mov %%db6, %0" : "=r" (val));
     78 		break;
     79 	case 7:
     80 		asm("mov %%db7, %0" : "=r" (val));
     81 		break;
     82 	default:
     83 		val = 0;
     84 	}
     85 	return val;
     86 }
     87 
     88 #endif
     89