3803 register initialization
wim寄存器
window invalid mask,窗口无效屏蔽寄存器,如果某bit为1,则表示该窗口无效,不能使用。
初始化,设置%psr.CWP=0,即当前使用win0;设置wim=2,即只有win1不能使用,win0,7,6,5,4,3,2都能使用。
save时,CWP-1,变为窗口7;再save,变为窗口6。(寄存器窗口环中有描述)
restore时,CWP+1
手册p249:
窗口无效屏蔽寄存器(WIM),由于%psr.CWP 已设置为 ,也就是当前窗口指向 窗口,为了最大化利用窗口寄存器,一般把 WIM 设置为窗口 ,即 WIM设置为 ,示例代码如下:
set , %g1
mov %g1, %wim
nop
nop
nop
窗口上溢出的trap处理示例,来自Peter Magnusson
/* a SAVE instruction caused a trap */
window_overflow:
/* rotate WIM on bit right, we have 8 windows */
mov %wim,%l3
sll %l3,,%l4
srl %l3,,%l3
or %l3,%l4,%l3
and %l3,0xff,%l3 /* disable WIM traps */
mov %g0,%wim
nop; nop; nop /* point to correct window */
save /* dump registers to stack */
std %l0, [%sp + ]
std %l2, [%sp + ]
std %l4, [%sp + ]
std %l6, [%sp + ]
std %i0, [%sp + ]
std %i2, [%sp + ]
std %i4, [%sp + ]
std %i6, [%sp + ] /* back to where we should be */
restore /* set new value of window */
mov %l3,%wim
nop; nop; nop /* go home */
jmp %l1
rett %l2
Figure - window_underflow trap handler
下面的代码,对wim循环右移1bit,比如,假定wim为0xFE,则%l3>>1=0x7F=%l3, %l3<<7=0, 最后%l3=0x7F
/* rotate WIM on bit right, we have 8 windows */
mov %wim,%l3
sll %l3,,%l4
srl %l3,,%l3
or %l3,%l4,%l3
and %l3,0xff,%l3
然后,对wim清零,即不会再有overflow trap
/* disable WIM traps */
mov %g0,%wim
然后,再save,到新的窗口(刚刚因为原来的wim,save时进的window overflow trap,现在不会进了),将新窗口里的本地l和输入i寄存器保存到内存中。
然后,再restore,回到旧窗口。
最后,将wim设置为新的%l3=0x7F,然而,再重新执行刚才触发trap overflow的指令(发生trap时,会将PC放在%l1中)。
v8手册中说,rett也会对CWP+1,为什么,进入trap overflow的时候应该没有CWP-1,此时+1是为什么?
/* set new value of window */
mov %l3,%wim
nop; nop; nop
/* go home */
jmp %l1
rett %l2
trap发生时,系统(不是程序???)进行如下操作:
其中,trap会开启一个新的寄存器窗口,以上面wim=0xFE为例,最开始使用win0,当调用发生时,在被调函数中执行的第一句save,会使CWP=7,而win7被屏蔽了,会触发windows overflow trap。
此时,设置ET=0,设置CWP=7,因为ET=0,因此,并不继续发生trap。
然后,进入上面的trap处理过程。
在上面处理过程中,还会save一次,那就进入win6了,再保存register,为什么?
TBR
Trap Base Register,异常基址寄存器,定义了trap发生时跳转目标地址。手册p249:
下图中_trap_table为trap表的标号,trap表需要在初始地址,如下图设置的是0x40000000,需要保证trap表在汇编S文件中位于.text节的起始,且链接时,该S文件为第一个目标文件。
异常基址寄存器(TBR)定义了响应 trap/中断时系统的跳转目标的基地址,必须是一个 4K 字节地址对齐的值,一般是 trap 表的标号。示例如下:
sethi %hi(_trap_table), %g1 !或者用绝对值,如set 0x40000000,%g1
mov %g1, %tbr
nop
nop
nop
reference:
BM3803FMGRH产品使用手册_v1.7_2018.09.26
链接:https://pan.baidu.com/s/1HDJvAm1xy8SWVQqDOr_2Rg
提取码:ol09
Peter Magnusson《Understanding stacks and registers in the Sparcarchitecture(s)》
http://icps.u-strasbg.fr/people/loechner/public_html/enseignement/SPARC/sparcstack.html
链接:https://pan.baidu.com/s/1V65DP5ke5m5ghVTHHOwgyg
提取码:hjxw
3803 register initialization的更多相关文章
- System Address Map Initialization in x86/x64 Architecture Part 2: PCI Express-Based Systems
原文 http://resources.infosecinstitute.com/system-address-map-initialization-x86x64-architecture-pa ...
- K60 启动过程分析
很高兴老师借给我一K60的开发板,趁着暑假好好鼓捣鼓捣! 有了上图的过程分析我想心里大概有个低了吧! 以下看代码: /* CodeWarrior ARM Runtime Support Library ...
- ChibiOS/RT 2.6.9 CAN Low Level Driver for STM32
/* ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio Licensed under the Apache License, Version 2 ...
- I.MX6 uSDHC SD card register
/**************************************************************************** * I.MX6 uSDHC SD card ...
- Failed to register Grid Infrastructure type ora.mdns.type
安装11g的集群软件的时候,在最后运行root.sh脚本时候,没有执行成功,最后提示如下错误: [root@r2 ~]# /u01/app/11.2.0/grid_1/root.sh Performi ...
- I.MX6 Ar8031 device register hacking
/***************************************************************************** * I.MX6 Ar8031 device ...
- Windows Forms Application Creation and Initialization
Windows Forms Application Creation and Initialization This topic details the steps performed after a ...
- UVM基础之---------uvm factory机制register
factory机制的一大特点就是根据类的名字来创建类的实例. factory 机制中根据类名来创建类的实例所用到的技术:一是参数化的类,二是静态变量和静态函数.这两者是factory机制实现的根本所在 ...
- OGG-Oracle 集成模式抽取进程,REGISTER DATABASE都做了什么?
一.学习目标 有同事问OGG技术问题,OGG软件,在oracle数据库中,集成模式抽取进程REGISTER DATABASE,都做了什么操作? 有什么风险? 并且提到了一个抽取进程注册,在瞬时间并发占 ...
随机推荐
- Babel+vscode实现APICloud开发中兼容ES6及以上代码
本文出自APICloud官方论坛, 感谢论坛版主 penghuoyan 的分享. 使用APICloud开发时,考虑到兼容问题一直使用ES5开发,时间越久感觉越落后,整理了一个兼容ES6的开发环境, ...
- 搞定SpringBoot多数据源(2):动态数据源
目录 1. 引言 2. 动态数据源流程说明 3. 实现动态数据源 3.1 说明及数据源配置 3.1.1 包结构说明 3.1.2 数据库连接信息配置 3.1.3 数据源配置 3.2 动态数据源设置 3. ...
- C#反射与特性(八):反射操作的示例大全
目录 1,InvokeMember 1.1 InvokeMember 参数 1.2 实践使用 InvokeMember 和成员的重载方法 微信平台,此文仅授权<NCC 开源社区>订阅号发布 ...
- JDBC超时设置【转】
恰当的JDBC超时设置能够有效地减少服务失效的时间.本文将对数据库的各种超时设置及其设置方法做介绍. 真实案例:应用服务器在遭到DDos攻击后无法响应 在遭到DDos攻击后,整个服务都垮掉了.由于第四 ...
- 新上手jupyterlab安装及问题解决
最近jupyter notebook又出了一个新玩法:jupyterlab但是很多小伙伴和我一样,在安装的时候出现了很多问题,于是乎我总结了一下,希望给大家带来帮助 首先,最好保持你的浏览器是最新的版 ...
- Oracle GoldenGate to Confluent with Kafka Connect
Confluent is a company founded by the team that built Apache Kafka. It builds a platform around Kafk ...
- Redis(六):list/lpush/lrange/lpop 命令源码解析
上一篇讲了hash数据类型的相关实现方法,没有茅塞顿开也至少知道redis如何搞事情的了吧. 本篇咱们继续来看redis中的数据类型的实现: list 相关操作实现. 同样,我们以使用者的角度,开始理 ...
- 第一章001-003课程介绍、计算机网络概述、Internet概述
计算机网络概述 课程安排: 第一章:概述 第二章:物理层 第三章:数据链路层 第四章:网络层 第五章:运输层 第六章:应用层 第七章:网络安全 第八章:因特网上的音频/视频服务 第九章:无线网络 第十 ...
- Dynamics email的subject标题出现 CRM:0000xxxx
怎样移除email subject标题中出现的CRM:0000xxxx Settings->Administration->System Settings->Email->Un ...
- centos7下redis安全相关
Centos7下redis安全相关 在使用云服务器时,安装的redis3.0+版本都关闭了protected-mode,因而都遭遇了挖矿病毒的攻击,使得服务器99%的占用率!! 因此我们在使用redi ...