⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proc_reg.h

📁 linux下简单实现VOS游戏
💻 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 + -