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 已设置为 0,也就是当前窗口指向 0 窗口,为了最大化利用窗口寄存器,一般把 WIM 设置为窗口 1,即 WIM设置为 2,示例代码如下:
set 2, %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,7,%l4
        srl %l3,1,%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 +  0]
        std %l2, [%sp +  8]
        std %l4, [%sp + 16]
        std %l6, [%sp + 24]
        std %i0, [%sp + 32]
        std %i2, [%sp + 40]
        std %i4, [%sp + 48]
        std %i6, [%sp + 56]

        /* 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 9 - window_underflow trap handler
View Code

下面的代码,对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,7,%l4
        srl %l3,1,%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发生时,系统(不是程序???)进行如下操作:

View Code

其中,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)