blob: 44b8ba25542b875253b9ffba0b51754a31d8b6cc [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
Stefan Reinauer2acf8482012-12-02 04:49:50 +00002/*
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
Stefan Reinauer2acf8482012-12-02 04:49:50 +000013 */
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*/
22static 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
30static inline void write_cr0(unsigned long val)
31{
32 asm volatile ("movl %0, %%cr0" : : "r" (val) : "memory");
33}
34
35static 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
43static 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
51static 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
59static 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