📄 proc_reg.h
字号:
/* * proc_reg.c * Modified for use in 15-410 at CMU * Zachary Anderson(zra) *//* * Copyright (c) 1995, 1996, 1998 University of Utah and the Flux Group. * All rights reserved. * * This file is part of the Flux OSKit. The OSKit is free software, also known * as "open source;" you can redistribute it and/or modify it under the terms * of the GNU General Public License (GPL), version 2, as published by the Free * Software Foundation (FSF). To explore alternate licensing terms, contact * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. * * The OSKit is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GPL for more details. You should have * received a copy of the GPL along with the OSKit; see the file COPYING. If * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. *//* * Mach Operating System * Copyright (c) 1991,1990 Carnegie Mellon University * All Rights Reserved. * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. * * Carnegie Mellon requests users of this software to return to * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. *//* * Processor registers for i386 and i486. */#ifndef _PROC_REG_H_#define _PROC_REG_H_/* * CR0 */#define CR0_PG 0x80000000 /* enable paging */#define CR0_CD 0x40000000 /* i486: cache disable */#define CR0_NW 0x20000000 /* i486: no write-through */#define CR0_AM 0x00040000 /* i486: alignment check mask */#define CR0_WP 0x00010000 /* i486: write-protect kernel access */#define CR0_NE 0x00000020 /* i486: handle numeric exceptions */#define CR0_ET 0x00000010 /* extension type is 80387 */ /* (not official) */#define CR0_TS 0x00000008 /* task switch */#define CR0_EM 0x00000004 /* emulate coprocessor */#define CR0_MP 0x00000002 /* monitor coprocessor */#define CR0_PE 0x00000001 /* enable protected mode *//* * CR4 */#define CR4_VME 0x00000001 /* enable virtual intrs in v86 mode */#define CR4_PVI 0x00000002 /* enable virtual intrs in pmode */#define CR4_TSD 0x00000004 /* disable RDTSC in user mode */#define CR4_DE 0x00000008 /* debug extensions (I/O breakpoints) */#define CR4_PSE 0x00000010 /* page size extensions */#define CR4_PAE 0x00000020 /* physical address extensions */#define CR4_MCE 0x00000040 /* machine check exception */#define CR4_PGE 0x00000080 /* page global extensions */#define CR4_PCE 0x00000100 /* enable read perf counter instr */#ifdef __GNUC__inline void set_eflags(unsigned eflags);inline void cld(void);inline void std(void);inline void clts(void);inline unsigned short get_cs(void);inline unsigned short get_ds(void);inline void set_ds(unsigned short ds);inline unsigned short get_es(void);inline void set_es(unsigned short es);inline unsigned short get_fs(void);inline void set_fs(unsigned short fs);inline unsigned short get_gs(void);inline void set_gs(unsigned short gs);inline unsigned short get_ss(void);inline void set_ss(unsigned short ss);#define disable_interrupts() \ ({ \ asm volatile("cli;\ pushl %%ebx;\ movl $0x3badd00d, %%ebx;\ xchg %%bx, %%bx;\ popl %%ebx": : : "%eax", "%ebx");\ })#define enable_interrupts() \ ({ \ asm volatile("pushl %%ebx;\ movl $0x4badd00d, %%ebx;\ xchg %%bx, %%bx;\ popl %%ebx;\ sti": : : "%eax", "%ebx");\ })#define get_eax() \ ({ \ register unsigned int _temp__; \ asm("movl %%eax, %0" : "=r" (_temp__)); \ _temp__; \ })#define get_ebx() \ ({ \ register unsigned int _temp__; \ asm("movl %%ebx, %0" : "=r" (_temp__)); \ _temp__; \ })#define get_ecx() \ ({ \ register unsigned int _temp__; \ asm("movl %%ecx, %0" : "=r" (_temp__)); \ _temp__; \ })#define get_edx() \ ({ \ register unsigned int _temp__; \ asm("movl %%edx, %0" : "=r" (_temp__)); \ _temp__; \ })#define get_esi() \ ({ \ register unsigned int _temp__; \ asm("movl %%esi, %0" : "=r" (_temp__)); \ _temp__; \ })#define get_edi() \ ({ \ register unsigned int _temp__; \ asm("movl %%edi, %0" : "=r" (_temp__)); \ _temp__; \ })#define get_ebp() \ ({ \ register unsigned int _temp__; \ asm("movl %%ebp, %0" : "=r" (_temp__)); \ _temp__; \ })#define get_esp() \ ({ \ register unsigned int _temp__; \ asm("movl %%esp, %0" : "=r" (_temp__)); \ _temp__; \ })#define get_eflags() \ ({ \ register unsigned int _temp__; \ asm volatile("pushfl; popl %0" : "=r" (_temp__)); \ _temp__; \ })#define get_eip() \ ({ \ register unsigned int _temp__; \ asm("1: movl $1b, %0" : "=r" (_temp__)); \ _temp__; \ })#define get_cr0() \ ({ \ register unsigned int _temp__; \ asm volatile("mov %%cr0, %0" : "=r" (_temp__)); \ _temp__; \ })#define set_cr0(value) \ ({ \ register unsigned int _temp__ = (value); \ asm volatile("mov %0, %%cr0" : : "r" (_temp__)); \ })#define get_cr4() \ ({ \ register unsigned int _temp__; \ asm volatile("mov %%cr4, %0" : "=r" (_temp__)); \ _temp__; \ })#define set_cr4(value) \ ({ \ register unsigned int _temp__ = (value); \ asm volatile("mov %0, %%cr4" : : "r" (_temp__)); \ })#define get_msw() \ ({ \ unsigned short _msw__; \ asm volatile("smsw %0" : "=r" (_msw__)); \ _msw__; \ })#define get_cr2() \ ({ \ register unsigned int _temp__; \ asm("mov %%cr2, %0" : "=r" (_temp__)); \ _temp__; \ })#define get_cr3() \ ({ \ register unsigned int _temp__; \ asm("mov %%cr3, %0" : "=r" (_temp__)); \ _temp__; \ })#define set_cr3(value) \ ({ \ register unsigned int _temp__ = (value); \ asm volatile("mov %0, %%cr3" : : "r" (_temp__)); \ })#define set_cr3_debug(value) \ ({ \ set_cr3(value);\ SIM_switch(value);\ })#define set_ts() \ set_cr0(get_cr0() | CR0_TS)#define clear_ts() \ asm volatile("clts")#define get_tr() \ ({ \ unsigned short _seg__; \ asm volatile("str %0" : "=rm" (_seg__) ); \ _seg__; \ })#define set_tr(seg) \ asm volatile("ltr %0" : : "rm" ((unsigned short)(seg)) )#define set_gdt(pseudo_desc) \ ({ \ asm volatile("lgdt %0" : : "m" ((pseudo_desc)->limit)); \ })#define set_idt(pseudo_desc) \ ({ \ asm volatile("lidt %0" : : "m" ((pseudo_desc)->limit)); \ })#define get_ldt() \ ({ \ unsigned short _seg__; \ asm volatile("sldt %0" : "=rm" (_seg__) ); \ _seg__; \ })#define set_ldt(seg) \ asm volatile("lldt %0" : : "rm" ((unsigned short)(seg)) )/* * Read the 64-bit timestamp counter (TSC) register. * Works only on Pentium and higher processors, * and in user mode only if the TSD bit in CR4 is not set. */#define get_tsc() \ ({ \ unsigned long low, high; \ asm volatile("rdtsc" : "=d" (high), "=a" (low)); \ ((unsigned long long)high << 32) | low; \ })#define rdmsr(msr) \ ({ \ unsigned long low, high; \ asm volatile("rdmsr" : "=d" (high), "=a" (low) : "c" (msr)); \ ((unsigned long long)high << 32) | low; \ })#define wrmsr(msr, high, low) \ ({ \ asm volatile("wrmsr" : : "d" (high), "a" (low), "c" (msr)); \ })#define wrmsrll(msr, val) \ ({ \ asm volatile("wrmsr" : : "A" (val), "c" (msr)); \ })/* * This doesn't set a processor register, * but it's often used immediately after setting one, * to flush the instruction queue. */#define flush_instr_queue() \ asm volatile("\ jmp 0f;\ 0:\ ")#endif /* __GNUC__ */#endif /* _PROC_REG_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -