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@gmail.com>
7 *
8 * (C) Copyright 2002
9 * Daniel Engström, Omicron Ceti AB, <daniel@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 */
read_cr0(void)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
write_cr0(unsigned long val)30 static inline void write_cr0(unsigned long val)
31 {
32 asm volatile ("movl %0, %%cr0" : : "r" (val) : "memory");
33 }
34
read_cr2(void)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
read_cr3(void)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
read_cr4(void)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
get_debugreg(int regno)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