uboot/arch/x86/include/asm/control_regs.h
<<
>>
Prefs
   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*/
  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
  89