程序 linux/include/linux/math_emu.h 1 /* 2 * linux/include/linux/math_emu.h 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 #ifndef _LINUX_MATH_EMU_H 7 #de

Similar documents
1 CPU interrupt INT trap CPU exception

CC213

36 asm ("mov %%fs,%%ax":"=a" ( res):); \ 37 res;}) 38 // 以下定义了一些函数原型 39 void page_exception(void); // 页异常 实际是 page_fault(mm/page.s,14) void divi

gcc 对整型和浮点型参数传递的汇编码生成特点分析 张昱 1. 相关资料 关于浮点数 (Floating-point) 的存储表示 : 浮点数的存储目前广泛采用 IEEE 754 标准 (1980 年 Intel 提出, 1985 年被 IEEE 采纳,

Linux kernel exploit研究和探索

C/C++语言 - C/C++数据

C C

Static Enforcement of Security with Types

幻灯片 1

untitled

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

学习MSP430单片机推荐参考书

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

一 学 校 基 本 情 况 目 录 二 部 门 预 算 报 表 ( 一 ) 收 支 总 表 ( 二 ) 收 入 总 表 ( 三 ) 支 出 总 表 ( 四 ) 财 政 拨 款 支 出 表 三 部 门 预 算 报 表 说 明 ( 一 ) 收 支 总 表 说 明 ( 二 ) 收 入 总 表 说 明 (

目 录 一 学 校 基 本 情 况 二 2016 年 预 算 报 表 ( 一 ) 中 南 大 学 收 支 预 算 总 表 ( 二 ) 中 南 大 学 收 入 预 算 表 ( 三 ) 中 南 大 学 支 出 预 算 表 ( 四 ) 中 南 大 学 财 政 拨 款 支 出 预 算 表 三 2016 年

信息参考

Microsoft Word - 15dbtb007

C 1

C/C++ - 文件IO

新・解きながら学ぶC言語

Kernel Kernel Kernel Kernel load estimator runqueue kernel/sched.

A. 城 市 化 是 我 国 发 展 的 必 由 之 路 B. 单 纯 发 展 大 城 市 不 利 于 城 市 化 的 推 进 C: 要 实 现 城 市 化, 就 必 须 让 城 市 充 分 吸 纳 农 村 人 口 D: 大 城 市 对 外 地 农 村 人 口 的 吸 引 力 明 显 低 于 中 小

新版 明解C++入門編

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco

新版 明解C言語入門編

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha


<4D F736F F D D6D0B9FAB5D8D6CAB4F3D1A7BFC6D1D0BEADB7D1D3D0B9D8D6C6B6C82D48442E646F63>

被当作鬼的人.doc

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt

*33*!!! "!! #$! %#! "& "! #! %! # ( ) * # +, # -, # +., $ /# ( ) 0 $ +# ( ) 0 $.# ( ) 0 $ # $! % "" " % 1 % & ( * ) * % " " %.! % 2!!"+# ( "&! " ( "#

华恒家庭网关方案

µÚ¶þÕ µ¥´¦ÀíÆ÷Ìåϵ½á¹¹

46 * the current mask in old_mask and block until a signal comes in. 47 */ /* 自动地更换成新的信号屏蔽码, 并等待信号的到来 * * 我们需要对系统调用 (syscall) 做一些处理 我们会从系统调用库接口取得某些信息

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C Project 30 C Project 3 60 Project 40

礼仪玉和葬玉

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

PowerPoint Presentation

_汪_文前新ok[3.1].doc

新・明解C言語入門編『索引』

<4D F736F F D20B9F9B0EABBCDBBAFAB48DEB3B4C1A5BDB3F8A7692E646F63>

C/C++程序设计 - 字符串与格式化输入/输出

2016 年 地 质 工 程 系 教 学 工 作 安 排 2016 学 年 我 系 将 在 总 结 过 去 工 作 的 基 础 上, 结 合 今 年 学 院 以 抓 质 量 强 内 涵 促 改 革 调 结 构 建 品 牌 细 管 理 重 过 程 为 宗 旨, 以 规 范 管 理 深 化 内 涵 为

<4D F736F F D203136BCADBBD8D2E4D3EBD1D0BEBF2E646F63>

萧山中学课程建设方案.doc


Microsoft Word - 9pinggb_A4.doc

Microsoft Word - 9pinggb_A4-f4.doc

理 论 探 索 事 业 单 位 改 革 的 五 点 思 考 余 路 [ 摘 要 ] 事 业 单 位 改 革 是 中 国 改 革 的 重 要 环 节, 其 影 响 力 和 难 度 不 亚 于 国 有 企 业 改 革 本 文 着 重 围 绕 推 进 事 业 单 位 改 革 应 考 虑 的 五 个 方 面

日 本 位 于 亚 洲 东 部, 太 平 洋 西 北 角, 是 我 国 东 方 的 一 个 岛 国 在 洪 积 世 ( 注 1) 的 大 部 分 时 期 内, 日 本 与 大 陆 相 连 大 约 在 洪 积 世 晚 期 至 冲 积 世 ( 注 2) 初 期, 日 本 各 地 发 生 海 进, 出 现

2深化教育教学改革、创新人才培养模式


Microsoft Word - 9pinggb_let.doc

实 习 上 下 点 表 格 解 释 和 相 关 纪 律 要 求 : 1 表 格 中 所 有 名 词 都 为 简 称, 包 括 医 院 名 称 四 年 级 五 年 级 各 专 业 名 称 等 所 有 时 间 都 为 学 生 装 好 行 李 出 发 时 间, 请 提 前 0 分 钟 将 行 李 运 到

3 基 金 杠 杆 从 分 级 基 金 的 概 念, 我 们 知 道 了 分 级 基 金 的 A 份 额 是 每 年 获 得 固 定 收 益 的 稳 健 份 额,B 份 额 是 具 有 杠 杆 效 应 的 激 进 份 额 分 级 基 金 中 的 杠 杆 一 般 有 三 类 : 份 额 杠 杆 =(A

简报158期.doc

Microsoft Word - 9pingb5_let.doc

退休權益.ppt [相容模式]

Microsoft Word - 1.《國文》試題評析.doc

Ps22Pdf

$%%& ()*+, %&, %-&&%%,. $ %,, $,, & /$- 0(1 $%%& %& 234 %-%, 5&%6&633 & 3%%, 3-%, %643 -%%% :::; 7<9; %-%, 3$%$ :::;

# $# #!# # # # # # # %# # # &# # # # #! "

zt

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

公共圖書館利用教育方案規劃之研究


<4D F736F F D B0EABB79A4E5B8D5C344BBBCB065AAA9>


康體藝術

C语言的应用.PDF

2014年大学生村官考试公共基础知识:社会革命和社会改革

朝陽科技大學八十八學年度招考碩士班簡章目錄

untitled

達文西密碼

Microsoft PowerPoint - 10 模板 Template.pptx

c_cpp

汇集全球21位医生的经验和智慧,总结出最实用的专业建议,这些都是最值得你牢记的健康提醒

1 行 业 发 展 不 平 衡 我 国 房 地 产 中 介 服 务 业 起 步 较 晚, 专 业 分 工 程 度 和 国 外 发 达 国 家 相 比 还 有 很 大 差 距 房 地 产 中 介 服 务 行 业 的 发 展 水 平 与 房 地 产 开 发 行 业 的 市 场 化 水 平 密 切 相 关

C/C++ - 函数

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

FY.DOC

浙江大学本科论文模板

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

untitled

提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, / 11

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

untitled

C

1

untitled


bingdian001.com

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63>

今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单, 新加了个区段放病毒执行代码, 执行病毒代码, 最后跳回原入口点来执行原文件 下面就是感染后的代码的简单分析 : ; =============== S U B R O U T I N E =====================

Microsoft PowerPoint - os_4.ppt

目录

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

药大研〔2015〕78号

Transcription:

程序 14-24 linux/include/linux/math_emu.h 1 /* 2 * linux/include/linux/math_emu.h 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 #ifndef _LINUX_MATH_EMU_H 7 #define _LINUX_MATH_EMU_H 8 9 #include <linux/sched.h> // 调度程序头文件 定义了任务结构 task_struct 任务 0 的数据, // 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句 10 // CPU 产生异常中断 int 7 时在栈中分布的数据构成的结构, 与系统调用时内核栈中数据分布类似 11 struct info { 12 long math_ret; // math_emulate() 调用者 (int7) 返回地址 13 long orig_eip; // 临时保存原 EIP 的地方 14 long edi; // 异常中断 int7 处理过程入栈的寄存器 15 long esi; 16 long ebp; 17 long sys_call_ret; // 中断 7 返回时将去执行系统调用的返回处理代码 18 long eax; // 以下部分 (18--30 行 ) 与系统调用时栈中结构相同 19 long ebx; 20 long ecx; 21 long edx; 22 long orig_eax; // 如不是系统调用而是其它中断时, 该值为 -1 23 long fs; 24 long es; 25 long ds; 26 long eip; // 26 -- 30 行由 CPU 自动入栈 27 long cs; 28 long eflags; 29 long esp; 30 long ss; 31 }; 32 // 为便于引用 info 结构中各字段 ( 栈中数据 ) 所定义的一些常量 33 #define EAX (info-> eax) 34 #define EBX (info-> ebx) 35 #define ECX (info-> ecx) 36 #define EDX (info-> edx) 37 #define ESI (info-> esi) 38 #define EDI (info-> edi) 39 #define EBP (info-> ebp) 40 #define ESP (info-> esp) 41 #define EIP (info-> eip) 42 #define ORIG_EIP (info-> orig_eip) 43 #define EFLAGS (info-> eflags) 44 #define DS (*(unsigned short *) &(info-> ds)) 45 #define ES (*(unsigned short *) &(info-> es)) 46 #define FS (*(unsigned short *) &(info-> fs)) 47 #define CS (*(unsigned short *) &(info-> cs)) 48 #define SS (*(unsigned short *) &(info-> ss))

49 // 终止数学协处理器仿真操作 在 math_emulation.c 程序中实现 (L488 行 ) // 下面 52-53 行上宏定义的实际作用是把 math_abort 重新定义为一个不会返回的函数 // ( 即在前面加上了 volatile) 该宏的前部分: // (volatile void (*)(struct info *,unsigned int)) // 是函数类型定义, 用于重新指明 math_abort 函数的定义 后面是其相应的参数 // 关键词 volatile 放在函数名前来修饰函数, 是用来通知 gcc 编译器该函数不会返回, // 以让 gcc 产生更好一些的代码 详细说明请参见第 3 章 $3.3.2 节内容 // 因此下面的宏定义, 其主要目的就是利用 math_abort, 让它即可用作普通有返回函数, // 又可以在使用宏定义 math_abort() 时用作不返回的函数 50 void math_abort(struct info *, unsigned int); 51 52 #define math_abort(x,y) \ 53 (((volatile void (*)(struct info *,unsigned int)) math_abort)((x),(y))) 54 55 /* 56 * Gcc forces this stupid alignment problem: I want to use only two longs 57 * for the temporary real 64-bit mantissa, but then gcc aligns out the 58 * structure to 12 bytes which breaks things in math_emulate.c. Shit. I 59 * want some kind of "no-alignt" pragma or something. 60 */ /* * Gcc 会强迫这种愚蠢的对齐问题 : 我只想使用两个 long 类型数据来表示 64 比特的 * 临时实数尾数, 但是 gcc 却会将该结构以 12 字节来对齐, 这将导致 math_emulate.c * 中程序出问题 唉, 我真需要某种非对齐 no-align 编译指令 */ 61 // 临时实数对应的结构 62 typedef struct { 63 long a,b; // 共 64 比特尾数 其中 a 为低 32 位,b 为高 32 位 ( 包括 1 位固定位 ) 64 short exponent; // 指数值 65 } temp_real; 66 // 为了解决上面英文注释中所提及的对齐问题而设计的结构, 作用同上面 temp_real 结构 67 typedef struct { 68 short m0,m1,m2,m3; 69 short exponent; 70 } temp_real_unaligned; 71 // 把 temp_real 类型值 a 赋值给 80387 栈寄存器 b (ST(i)) 72 #define real_to_real(a,b) \ 73 ((*(long long *) (b) = *(long long *) (a)),((b)->exponent = (a)->exponent)) 74 // 长实数 ( 双精度 ) 结构 75 typedef struct { 76 long a,b; // a 为长实数的低 32 位 ;b 为高 32 位 77 } long_real; 78 79 typedef long short_real; // 定义短实数类型 80 // 临时整数结构 81 typedef struct { 82 long a,b; // a 为低 32 位 ;b 为高 32 位

83 short sign; // 符号标志 84 } temp_int; 85 // 80387 协处理器内部的状态字寄存器内容对应的结构 ( 参见图 11-6) 86 struct swd { 87 int ie:1; // 无效操作异常 88 int de:1; // 非规格化异常 89 int ze:1; // 除零异常 90 int oe:1; // 上溢出异常 91 int ue:1; // 下溢出异常 92 int pe:1; // 精度异常 93 int sf:1; // 栈出错标志, 表示累加器溢出造成的异常 94 int ir:1; // ir, b: 若上面 6 位任何未屏蔽异常发生, 则置位 95 int c0:1; // c0--c3: 条件码比特位 96 int c1:1; 97 int c2:1; 98 int top:3; // 指示 80387 中当前位于栈顶的 80 位寄存器 99 int c3:1; 100 int b:1; 101 }; 102 // 80387 内部寄存器控制方式常量 103 #define I387 (current->tss.i387) // 进程的 80387 状态信息 参见 sched.h 文件 104 #define SWD (*(struct swd *) &I387.swd) // 80387 中状态控制字 105 #define ROUNDING ((I387.cwd >> 10) & 3) // 取控制字中舍入控制方式 106 #define PRECISION ((I387.cwd >> 8) & 3) // 取控制字中精度控制方式 107 // 定义精度有效位常量 108 #define BITS24 0 // 精度有效数 :24 位 ( 参见图 11-6) 109 #define BITS53 2 // 精度有效数 :53 位 110 #define BITS64 3 // 精度有效数 :64 位 111 // 定义舍入方式常量 112 #define ROUND_NEAREST 0 // 舍入方式 : 舍入到最近或偶数 113 #define ROUND_DOWN 1 // 舍入方式 : 趋向负无限 114 #define ROUND_UP 2 // 舍入方式 : 趋向正无限 115 #define ROUND_0 3 // 舍入方式 : 趋向截 0 116 // 常数定义 117 #define CONSTZ (temp_real_unaligned) {0x0000,0x0000,0x0000,0x0000,0x0000} // 0 118 #define CONST1 (temp_real_unaligned) {0x0000,0x0000,0x0000,0x8000,0x3FFF} // 1.0 119 #define CONSTPI (temp_real_unaligned) {0xC235,0x2168,0xDAA2,0xC90F,0x4000} // Pi 120 #define CONSTLN2 (temp_real_unaligned) {0x79AC,0xD1CF,0x17F7,0xB172,0x3FFE} // Loge(2) 121 #define CONSTLG2 (temp_real_unaligned) {0xF799,0xFBCF,0x9A84,0x9A20,0x3FFD} // Log10(2) 122 #define CONSTL2E (temp_real_unaligned) {0xF0BC,0x5C17,0x3B29,0xB8AA,0x3FFF} // Log2(e) 123 #define CONSTL2T (temp_real_unaligned) {0x8AFE,0xCD1B,0x784B,0xD49A,0x4000} // Log2(10) 124 // 设置 80387 各状态 125 #define set_ie() (I387.swd = 1) 126 #define set_de() (I387.swd = 2) 127 #define set_ze() (I387.swd = 4) 128 #define set_oe() (I387.swd = 8) 129 #define set_ue() (I387.swd = 16)

130 #define set_pe() (I387.swd = 32) 131 // 设置 80387 各控制条件 132 #define set_c0() (I387.swd = 0x0100) 133 #define set_c1() (I387.swd = 0x0200) 134 #define set_c2() (I387.swd = 0x0400) 135 #define set_c3() (I387.swd = 0x4000) 136 137 /* ea.c */ 138 // 计算仿真指令中操作数使用到的有效地址值, 即根据指令中寻址模式字节计算有效地址值 // 参数 : info - 中断时栈中内容对应结构 ; code - 指令代码 // 返回 : 有效地址值 139 char * ea(struct info * info, unsigned short code); 140 141 /* convert.c */ 142 // 各种数据类型转换函数 在 convert.c 文件中实现 143 void short_to_temp(const short_real * a, temp_real * b); 144 void long_to_temp(const long_real * a, temp_real * b); 145 void temp_to_short(const temp_real * a, short_real * b); 146 void temp_to_long(const temp_real * a, long_real * b); 147 void real_to_int(const temp_real * a, temp_int * b); 148 void int_to_real(const temp_int * a, temp_real * b); 149 150 /* get_put.c */ 151 // 存取各种类型数的函数 152 void get_short_real(temp_real *, struct info *, unsigned short); 153 void get_long_real(temp_real *, struct info *, unsigned short); 154 void get_temp_real(temp_real *, struct info *, unsigned short); 155 void get_short_int(temp_real *, struct info *, unsigned short); 156 void get_long_int(temp_real *, struct info *, unsigned short); 157 void get_longlong_int(temp_real *, struct info *, unsigned short); 158 void get_bcd(temp_real *, struct info *, unsigned short); 159 void put_short_real(const temp_real *, struct info *, unsigned short); 160 void put_long_real(const temp_real *, struct info *, unsigned short); 161 void put_temp_real(const temp_real *, struct info *, unsigned short); 162 void put_short_int(const temp_real *, struct info *, unsigned short); 163 void put_long_int(const temp_real *, struct info *, unsigned short); 164 void put_longlong_int(const temp_real *, struct info *, unsigned short); 165 void put_bcd(const temp_real *, struct info *, unsigned short); 166 167 /* add.c */ 168 // 仿真浮点加法指令的函数 169 void fadd(const temp_real *, const temp_real *, temp_real *); 170 171 /* mul.c */ 172 // 仿真浮点乘法指令 173 void fmul(const temp_real *, const temp_real *, temp_real *); 174

175 /* div.c */ 176 // 仿真浮点除法指令 177 void fdiv(const temp_real *, const temp_real *, temp_real *); 178 179 /* compare.c */ 180 // 比较函数 181 void fcom(const temp_real *, const temp_real *); // 仿真浮点指令 FCOM, 比较两个数 182 void fucom(const temp_real *, const temp_real *); // 仿真浮点指令 FUCOM, 无次序比较 183 void ftst(const temp_real *); // 仿真浮点指令 FTST, 栈顶累加器与 0 比较 184 185 #endif 186