亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? fpu_entry.c

?? 內(nèi)核是系統(tǒng)的心臟
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*---------------------------------------------------------------------------+
 |  fpu_entry.c                                                              |
 |                                                                           |
 | The entry function for wm-FPU-emu                                         |
 |                                                                           |
 | Copyright (C) 1992,1993,1994                                              |
 |                       W. Metzenthen, 22 Parker St, Ormond, Vic 3163,      |
 |                       Australia.  E-mail   billm@vaxc.cc.monash.edu.au    |
 |                                                                           |
 | See the files "README" and "COPYING" for further copyright and warranty   |
 | information.                                                              |
 |                                                                           |
 +---------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------+
 | Note:                                                                     |
 |    The file contains code which accesses user memory.                     |
 |    Emulator static data may change when user memory is accessed, due to   |
 |    other processes using the emulator while swapping is in progress.      |
 +---------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------+
 | math_emulate() is the sole entry point for wm-FPU-emu                     |
 +---------------------------------------------------------------------------*/

#include <linux/signal.h>
#include <linux/segment.h>

#include "fpu_system.h"
#include "fpu_emu.h"
#include "exception.h"
#include "control_w.h"
#include "status_w.h"

#include <asm/segment.h>

#define __BAD__ FPU_illegal   /* Illegal on an 80486, causes SIGILL */

#ifndef NO_UNDOC_CODE    /* Un-documented FPU op-codes supported by default. */

/* WARNING: These codes are not documented by Intel in their 80486 manual
   and may not work on FPU clones or later Intel FPUs. */

/* Changes to support the un-doc codes provided by Linus Torvalds. */

#define _d9_d8_ fstp_i    /* unofficial code (19) */
#define _dc_d0_ fcom_st   /* unofficial code (14) */
#define _dc_d8_ fcompst   /* unofficial code (1c) */
#define _dd_c8_ fxch_i    /* unofficial code (0d) */
#define _de_d0_ fcompst   /* unofficial code (16) */
#define _df_c0_ ffreep    /* unofficial code (07) ffree + pop */
#define _df_c8_ fxch_i    /* unofficial code (0f) */
#define _df_d0_ fstp_i    /* unofficial code (17) */
#define _df_d8_ fstp_i    /* unofficial code (1f) */

static FUNC const st_instr_table[64] = {
  fadd__,   fld_i_,  __BAD__, __BAD__, fadd_i,  ffree_,  faddp_,  _df_c0_,
  fmul__,   fxch_i,  __BAD__, __BAD__, fmul_i,  _dd_c8_, fmulp_,  _df_c8_,
  fcom_st,  fp_nop,  __BAD__, __BAD__, _dc_d0_, fst_i_,  _de_d0_, _df_d0_,
  fcompst,  _d9_d8_, __BAD__, __BAD__, _dc_d8_, fstp_i,  fcompp,  _df_d8_,
  fsub__,   fp_etc,  __BAD__, finit_,  fsubri,  fucom_,  fsubrp,  fstsw_,
  fsubr_,   fconst,  fucompp, __BAD__, fsub_i,  fucomp,  fsubp_,  __BAD__,
  fdiv__,   trig_a,  __BAD__, __BAD__, fdivri,  __BAD__, fdivrp,  __BAD__,
  fdivr_,   trig_b,  __BAD__, __BAD__, fdiv_i,  __BAD__, fdivp_,  __BAD__,
};

#else     /* Support only documented FPU op-codes */

static FUNC const st_instr_table[64] = {
  fadd__,   fld_i_,  __BAD__, __BAD__, fadd_i,  ffree_,  faddp_,  __BAD__,
  fmul__,   fxch_i,  __BAD__, __BAD__, fmul_i,  __BAD__, fmulp_,  __BAD__,
  fcom_st,  fp_nop,  __BAD__, __BAD__, __BAD__, fst_i_,  __BAD__, __BAD__,
  fcompst,  __BAD__, __BAD__, __BAD__, __BAD__, fstp_i,  fcompp,  __BAD__,
  fsub__,   fp_etc,  __BAD__, finit_,  fsubri,  fucom_,  fsubrp,  fstsw_,
  fsubr_,   fconst,  fucompp, __BAD__, fsub_i,  fucomp,  fsubp_,  __BAD__,
  fdiv__,   trig_a,  __BAD__, __BAD__, fdivri,  __BAD__, fdivrp,  __BAD__,
  fdivr_,   trig_b,  __BAD__, __BAD__, fdiv_i,  __BAD__, fdivp_,  __BAD__,
};

#endif NO_UNDOC_CODE


#define _NONE_ 0   /* Take no special action */
#define _REG0_ 1   /* Need to check for not empty st(0) */
#define _REGI_ 2   /* Need to check for not empty st(0) and st(rm) */
#define _REGi_ 0   /* Uses st(rm) */
#define _PUSH_ 3   /* Need to check for space to push onto stack */
#define _null_ 4   /* Function illegal or not implemented */
#define _REGIi 5   /* Uses st(0) and st(rm), result to st(rm) */
#define _REGIp 6   /* Uses st(0) and st(rm), result to st(rm) then pop */
#define _REGIc 0   /* Compare st(0) and st(rm) */
#define _REGIn 0   /* Uses st(0) and st(rm), but handle checks later */

#ifndef NO_UNDOC_CODE

/* Un-documented FPU op-codes supported by default. (see above) */

static unsigned char const type_table[64] = {
  _REGI_, _NONE_, _null_, _null_, _REGIi, _REGi_, _REGIp, _REGi_,
  _REGI_, _REGIn, _null_, _null_, _REGIi, _REGI_, _REGIp, _REGI_,
  _REGIc, _NONE_, _null_, _null_, _REGIc, _REG0_, _REGIc, _REG0_,
  _REGIc, _REG0_, _null_, _null_, _REGIc, _REG0_, _REGIc, _REG0_,
  _REGI_, _NONE_, _null_, _NONE_, _REGIi, _REGIc, _REGIp, _NONE_,
  _REGI_, _NONE_, _REGIc, _null_, _REGIi, _REGIc, _REGIp, _null_,
  _REGI_, _NONE_, _null_, _null_, _REGIi, _null_, _REGIp, _null_,
  _REGI_, _NONE_, _null_, _null_, _REGIi, _null_, _REGIp, _null_
};

#else     /* Support only documented FPU op-codes */

static unsigned char const type_table[64] = {
  _REGI_, _NONE_, _null_, _null_, _REGIi, _REGi_, _REGIp, _null_,
  _REGI_, _REGIn, _null_, _null_, _REGIi, _null_, _REGIp, _null_,
  _REGIc, _NONE_, _null_, _null_, _null_, _REG0_, _null_, _null_,
  _REGIc, _null_, _null_, _null_, _null_, _REG0_, _REGIc, _null_,
  _REGI_, _NONE_, _null_, _NONE_, _REGIi, _REGIc, _REGIp, _NONE_,
  _REGI_, _NONE_, _REGIc, _null_, _REGIi, _REGIc, _REGIp, _null_,
  _REGI_, _NONE_, _null_, _null_, _REGIi, _null_, _REGIp, _null_,
  _REGI_, _NONE_, _null_, _null_, _REGIi, _null_, _REGIp, _null_
};

#endif NO_UNDOC_CODE


/* Be careful when using any of these global variables...
   they might change if swapping is triggered */
unsigned char  FPU_rm;
char	       FPU_st0_tag;
FPU_REG       *FPU_st0_ptr;

/* ######## To be shifted */
unsigned long FPU_entry_op_cs;
unsigned short FPU_data_selector;


#ifdef PARANOID
char emulating=0;
#endif PARANOID

static int valid_prefix(unsigned char *Byte, unsigned char **fpu_eip,
			overrides *override);


asmlinkage void math_emulate(long arg)
{
  unsigned char  FPU_modrm, byte1;
  unsigned short code;
  fpu_addr_modes addr_modes;
  int unmasked;

#ifdef PARANOID
  if ( emulating )
    {
      printk("ERROR: wm-FPU-emu is not RE-ENTRANT!\n");
    }
  RE_ENTRANT_CHECK_ON;
#endif PARANOID

  if (!current->used_math)
    {
      int i;
      for ( i = 0; i < 8; i++ )
	{
	  /* Make sure that the registers are compatible
	     with the assumptions of the emulator. */
	  regs[i].exp = 0;
	  regs[i].sigh = 0x80000000;
	}
      finit();
      current->used_math = 1;
    }

  SETUP_DATA_AREA(arg);

  addr_modes.vm86 = (FPU_EFLAGS & 0x00020000) != 0;

  if ( addr_modes.vm86 )
    FPU_EIP += FPU_CS << 4;

  FPU_ORIG_EIP = FPU_EIP;

  if ( !addr_modes.vm86 )
    {
      /* user code space? */
      if (FPU_CS == KERNEL_CS)
	{
	  printk("math_emulate: %04x:%08lx\n",FPU_CS,FPU_EIP);
	  panic("Math emulation needed in kernel");
	}

      /* We cannot handle multiple segments yet */
      if (FPU_CS != USER_CS || FPU_DS != USER_DS)
	{
	  math_abort(FPU_info,SIGILL);
	}
    }

  FPU_lookahead = 1;
  if (current->flags & PF_PTRACED)
    FPU_lookahead = 0;

  if ( !valid_prefix(&byte1, (unsigned char **)&FPU_EIP,
		     &addr_modes.override) )
    {
      RE_ENTRANT_CHECK_OFF;
      printk("FPU emulator: Unknown prefix byte 0x%02x, probably due to\n"
	     "FPU emulator: self-modifying code! (emulation impossible)\n",
	     byte1);
      RE_ENTRANT_CHECK_ON;
      EXCEPTION(EX_INTERNAL|0x126);
      math_abort(FPU_info,SIGILL);
    }

do_another_FPU_instruction:

  FPU_EIP++;  /* We have fetched the prefix and first code bytes. */

#ifdef PECULIAR_486
  /* It would be more logical to do this only in get_address(),
     but although it is supposed to be undefined for many fpu
     instructions, an 80486 behaves as if this were done here: */
  FPU_data_selector = FPU_DS;
#endif PECULIAR_486

  if ( (byte1 & 0xf8) != 0xd8 )
    {
      if ( byte1 == FWAIT_OPCODE )
	{
	  if (partial_status & SW_Summary)
	    goto do_the_FPU_interrupt;
	  else
	    goto FPU_fwait_done;
	}
#ifdef PARANOID
      EXCEPTION(EX_INTERNAL|0x128);
      math_abort(FPU_info,SIGILL);
#endif PARANOID
    }

  RE_ENTRANT_CHECK_OFF;
  FPU_code_verify_area(1);
  FPU_modrm = get_fs_byte((unsigned short *) FPU_EIP);
  RE_ENTRANT_CHECK_ON;
  FPU_EIP++;

  if (partial_status & SW_Summary)
    {
      /* Ignore the error for now if the current instruction is a no-wait
	 control instruction */
      /* The 80486 manual contradicts itself on this topic,
	 but a real 80486 uses the following instructions:
	 fninit, fnstenv, fnsave, fnstsw, fnstenv, fnclex.
       */
      code = (FPU_modrm << 8) | byte1;
      if ( ! ( (((code & 0xf803) == 0xe003) ||    /* fnclex, fninit, fnstsw */
		(((code & 0x3003) == 0x3001) &&   /* fnsave, fnstcw, fnstenv,
						     fnstsw */
		 ((code & 0xc000) != 0xc000))) ) )
	{
	  /*
	   *  We need to simulate the action of the kernel to FPU
	   *  interrupts here.
	   *  Currently, the "real FPU" part of the kernel (0.99.10)
	   *  clears the exception flags, sets the registers to empty,
	   *  and passes information back to the interrupted process
	   *  via the cs selector and operand selector, so we do the same.
	   */
	do_the_FPU_interrupt:
	  cs_selector &= 0xffff0000;
	  cs_selector |= status_word();
      	  operand_selector = tag_word();
	  partial_status = 0;
	  top = 0;
	  {
	    int r;
	    for (r = 0; r < 8; r++)
	      {
		regs[r].tag = TW_Empty;
	      }
	  }

	  RE_ENTRANT_CHECK_OFF;
	  current->tss.trap_no = 16;
	  current->tss.error_code = 0;
	  send_sig(SIGFPE, current, 1);
	  return;
	}
    }

  FPU_entry_eip = FPU_ORIG_EIP;

  FPU_entry_op_cs = (byte1 << 24) | (FPU_modrm << 16) | (FPU_CS & 0xffff) ;

  FPU_rm = FPU_modrm & 7;

  if ( FPU_modrm < 0300 )
    {
      /* All of these instructions use the mod/rm byte to get a data address */
      if ( addr_modes.vm86
	  ^ (addr_modes.override.address_size == ADDR_SIZE_PREFIX) )
	get_address_16(FPU_modrm, &FPU_EIP, addr_modes);
      else
	get_address(FPU_modrm, &FPU_EIP, addr_modes);
      if ( !(byte1 & 1) )
	{
	  unsigned short status1 = partial_status;
	  FPU_st0_ptr = &st(0);
	  FPU_st0_tag = FPU_st0_ptr->tag;

	  /* Stack underflow has priority */
	  if ( NOT_EMPTY_0 )
	    {
	      unmasked = 0;  /* Do this here to stop compiler warnings. */
	      switch ( (byte1 >> 1) & 3 )
		{
		case 0:
		  unmasked = reg_load_single();
		  break;
		case 1:
		  reg_load_int32();
		  break;
		case 2:
		  unmasked = reg_load_double();
		  break;
		case 3:
		  reg_load_int16();

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
717成人午夜免费福利电影| 成人aa视频在线观看| 在线播放日韩导航| 亚洲第一av色| 制服丝袜一区二区三区| 久久er精品视频| 国产女人18毛片水真多成人如厕 | 久久久电影一区二区三区| 国产麻豆视频精品| 国产精品视频线看| 欧美在线不卡视频| 免费美女久久99| 中文字幕精品三区| 欧美亚洲高清一区| 久久91精品久久久久久秒播| 国产精品人妖ts系列视频| 欧美中文字幕一二三区视频| 蜜桃视频一区二区三区在线观看| 国产欧美一区二区三区鸳鸯浴| 色综合天天综合在线视频| 天堂精品中文字幕在线| 26uuu精品一区二区| 91欧美激情一区二区三区成人| 图片区小说区国产精品视频| 久久久噜噜噜久久人人看| 91丨porny丨国产| 免费看欧美美女黄的网站| 亚洲国产精品国自产拍av| 欧美日韩国产成人在线91| 国产一区二区调教| 亚洲国产精品影院| 国产三级精品三级在线专区| 欧美日韩mp4| 成人动漫一区二区| 美国av一区二区| 一区二区三区中文字幕精品精品| 精品国产乱码久久| 欧美日韩中文另类| 成人手机电影网| 蜜桃av噜噜一区二区三区小说| 国产精品成人一区二区三区夜夜夜| 欧美精品三级日韩久久| 99久久国产免费看| 激情深爱一区二区| 亚洲成av人影院在线观看网| 国产日韩一级二级三级| 日韩一区二区中文字幕| 欧美主播一区二区三区美女| 丁香激情综合国产| 精品一区二区免费在线观看| 午夜精品一区在线观看| 国产精品国产三级国产有无不卡| 精品区一区二区| 欧美一区二区三区电影| 在线精品亚洲一区二区不卡| yourporn久久国产精品| 国产精品性做久久久久久| 免费人成黄页网站在线一区二区| 亚洲一区二区三区四区不卡| 亚洲同性gay激情无套| 欧美激情中文字幕| 久久久久久久久久久黄色| 欧美成人官网二区| 欧美大黄免费观看| 日韩欧美一级在线播放| 5858s免费视频成人| 欧美三级韩国三级日本一级| 欧美主播一区二区三区| 欧美在线观看视频在线| 日本乱人伦一区| 在线免费观看成人短视频| 日本高清不卡aⅴ免费网站| 一本大道久久a久久精品综合| jlzzjlzz国产精品久久| 99久久99久久精品国产片果冻| 成人av在线资源网站| thepron国产精品| 不卡的av在线| 一本大道av一区二区在线播放| 色域天天综合网| 欧美亚日韩国产aⅴ精品中极品| 99国产精品久| 欧美天天综合网| 欧美精品vⅰdeose4hd| 5月丁香婷婷综合| 精品国产91洋老外米糕| 久久精品在线观看| 中文字幕在线不卡视频| 亚洲视频图片小说| 亚洲最新视频在线观看| 亚洲高清免费观看| 美国毛片一区二区| 成人性生交大片免费看中文| 91免费国产在线观看| 欧美日韩免费高清一区色橹橹| 欧美日韩国产免费| 久久蜜桃一区二区| 亚洲色图视频网| 午夜av一区二区三区| 蜜桃视频一区二区三区| 成人免费毛片app| 在线视频中文字幕一区二区| 国产麻豆一精品一av一免费| 国产精品人妖ts系列视频 | 日精品一区二区三区| 天堂蜜桃91精品| 国产一区二区免费在线| 国产成人综合网站| 中文字幕日韩一区二区| 亚洲国产日韩av| 日本一区二区免费在线| 一区二区三区在线播| 成人网页在线观看| 国产亚洲精品aa| 美腿丝袜亚洲综合| 天天影视涩香欲综合网| 国产欧美日韩在线视频| 麻豆精品一区二区av白丝在线| 久久99久久99小草精品免视看| 在线免费一区三区| 亚洲婷婷综合色高清在线| 国产成a人亚洲| 久久久久久久久久久久久女国产乱| 日本欧美在线观看| 欧美日韩免费一区二区三区| 亚洲女女做受ⅹxx高潮| 99久久精品国产观看| 国产精品久久久久精k8| 成人性色生活片| 中国av一区二区三区| 风间由美一区二区av101| 久久久久国产精品麻豆ai换脸| 激情六月婷婷久久| 国产情人综合久久777777| 精品在线一区二区| 久久综合视频网| 国产麻豆视频精品| 中文字幕高清不卡| 91亚洲资源网| 亚洲综合激情另类小说区| 欧美性三三影院| 首页亚洲欧美制服丝腿| 欧美一区二区高清| 国产尤物一区二区| 欧美激情在线免费观看| 不卡一区二区在线| 一区二区三区四区在线| 欧美网站一区二区| 奇米精品一区二区三区在线观看一 | 7777精品伊人久久久大香线蕉的 | 日本成人中文字幕在线视频| 欧美丰满嫩嫩电影| 久久精品国产色蜜蜜麻豆| 精品国产制服丝袜高跟| 国产成人免费视频精品含羞草妖精| 国产色产综合产在线视频 | 日韩欧美不卡在线观看视频| 狠狠色丁香久久婷婷综合_中| 久久精品一区八戒影视| 成人精品视频.| 亚洲一区二区三区在线看| 欧美一区二区性放荡片| 国产精品一区二区在线看| 国产精品国产三级国产普通话蜜臀| 91视频在线观看| 午夜成人在线视频| 久久久久久久综合日本| 色婷婷久久久综合中文字幕 | 99久久99久久精品免费观看| 亚洲一区二区三区四区在线免费观看 | 国产精品对白交换视频| 欧美日韩中文国产| 国产乱码精品一区二区三区av| 中文字幕一区二区三区蜜月| 欧美另类久久久品| 国产乱色国产精品免费视频| 亚洲人成影院在线观看| 日韩三级免费观看| 成人av在线电影| 免费在线观看精品| 亚洲天堂福利av| 日韩免费一区二区| 色综合色综合色综合| 麻豆成人免费电影| 亚洲精品精品亚洲| 337p粉嫩大胆噜噜噜噜噜91av| 一本在线高清不卡dvd| 国内一区二区在线| 午夜电影网一区| 亚洲色欲色欲www| 欧美成人a∨高清免费观看| 色综合视频在线观看| 国产精品99久久久久久有的能看| 亚洲成在线观看| 国产精品久久久久久久午夜片| 日韩欧美不卡在线观看视频| 91福利在线免费观看| 国产成人高清视频| 免费在线观看日韩欧美| 亚洲一区欧美一区|