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的更多相关文章

  1. 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 ...

  2. K60 启动过程分析

    很高兴老师借给我一K60的开发板,趁着暑假好好鼓捣鼓捣! 有了上图的过程分析我想心里大概有个低了吧! 以下看代码: /* CodeWarrior ARM Runtime Support Library ...

  3. 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 ...

  4. I.MX6 uSDHC SD card register

    /**************************************************************************** * I.MX6 uSDHC SD card ...

  5. Failed to register Grid Infrastructure type ora.mdns.type

    安装11g的集群软件的时候,在最后运行root.sh脚本时候,没有执行成功,最后提示如下错误: [root@r2 ~]# /u01/app/11.2.0/grid_1/root.sh Performi ...

  6. I.MX6 Ar8031 device register hacking

    /***************************************************************************** * I.MX6 Ar8031 device ...

  7. Windows Forms Application Creation and Initialization

    Windows Forms Application Creation and Initialization This topic details the steps performed after a ...

  8. UVM基础之---------uvm factory机制register

    factory机制的一大特点就是根据类的名字来创建类的实例. factory 机制中根据类名来创建类的实例所用到的技术:一是参数化的类,二是静态变量和静态函数.这两者是factory机制实现的根本所在 ...

  9. OGG-Oracle 集成模式抽取进程,REGISTER DATABASE都做了什么?

    一.学习目标 有同事问OGG技术问题,OGG软件,在oracle数据库中,集成模式抽取进程REGISTER DATABASE,都做了什么操作? 有什么风险? 并且提到了一个抽取进程注册,在瞬时间并发占 ...

随机推荐

  1. mysql复习2

    -- 1. 创建和管理表 CREATE TABLE -- 方式一:CREATE TABLE emp1( id INT(10), `name` VARCHAR(20), salary DOUBLE(10 ...

  2. C++数值计算

    1.序 (1)程序设计分两种: 1.结构化设计(面向过程)——分解算法为模块,将算法的步骤分解为模块. 2.面向对象程序设计——主要是“类”与“对象”. (2)进制的转换 1.二进制转十进制 整数部分 ...

  3. 个人任务day7

    今日计划: 整合程序,排除错误. 昨日成果: 写注册界面.

  4. 团队作业-Alpha版本发布2

    团队项目-系统设计 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/homework 这个作业要 ...

  5. MyBatis-Plus学习笔记(1):环境搭建以及基本的CRUD操作

    MyBatis-Plus是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,使用MyBatis-Plus时,不会影响原来Mybatis方式的使用. SpringBoot+M ...

  6. 基于BIO的实时Socket读写操作

    文章目录 前言 Socket类2.1 Socket的通信过程2.2 控制Socket连接2.3 设置Socket的选项 ServerSocket类3.1 构造ServerSocket3.2 Serve ...

  7. livego+obs+flv.js 搭建视频直播

    一.流程 主播通过 obs软件通过直播 ->推流到->直播服务器 客户通过浏览器 访问站点->flv.js拉取直播服务器视频流并播放 二.环境 centos7 直播服务器 https ...

  8. 学_汇编语言_王爽版 要点采集笔记(未完待续&hellip;)

    第一章 基础知识 存储器(内存)存放CPU工作的指令和数据(CPU可以直接使用的信息在内存中存放):指令和数据都是二进制数没有任何区别,由CPU决定是数据还是指令 内存单元:存储器被分为若干个存储单元 ...

  9. 简单的在jsp页面操作mysql

    ---恢复内容开始--- 上一篇讲了在DOS界面下操作mysql 现在我们来说说怎么在jsp页面中操作mysql 要用jsp页面操作mysql需要jdbc(不是非要jdbc,还有其他的) 下载地址:w ...

  10. ShiroINI配置及加密(三)

    Shiro InI 配置 ini语法: 1.对象名 = 全限定类名 相对于调用 public 无参构造器创建对象 2.对象名. 属性名 = 值 相当于调用 setter 方法设置常量值 3.对象名. ...