OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [exec/] [score/] [cpu/] [a29k/] [sig.S] - Rev 778

Go to most recent revision | Compare with Previous | Blame | View Log

;/*
; *  $Id: sig.S,v 1.2 2001-09-27 11:59:21 chris Exp $
; */

;       .include "register.ah"
        .include "amd.ah"
        .include "pswmacro.ah"
        .comm   WindowSize,4
        .text
        .reg    it0,gr64
        .reg    it1,gr65
        .reg    it2,gr66
        .reg    it3,gr67
        .reg    v0,gr96
        .reg    v1,gr97
        .reg    v2,gr98
        .reg    v3,gr99
        .reg    trapreg,it0
        .reg    FPStat0,gr79
        .reg    FPStat1,gr79
        .reg    FPStat2,gr79
        .reg    FPStat3,gr79

        .global _intr14
_intr14:
        const   it3,14
        sup_sv
        jmp     interrupt
        nop

        .global _intr18
_intr18:
        const   it3,18
        sup_sv
        jmp     interrupt
        nop

        .global _intr19
_intr19:
        const   it3,19
        sup_sv
        jmp     interrupt
        nop

interrupt:
        push    msp,it3
        push    msp,gr1
        push    msp,rab
        const   it0,512
        sub     rab,rfb,it0     ;set rab = rfb-512
        pushsr  msp,it0,pc0
        pushsr  msp,it0,pc1
        pushsr  msp,it0,pc2
        pushsr  msp,it0,cha
        pushsr  msp,it0,chd
        pushsr  msp,it0,chc
        pushsr  msp,it0,alu
        pushsr  msp,it0,ops
        push    msp,tav
;
;now come off freeze, and go to user-mode code.
;ensure load/store does not restart
;
        mtsrim  chc,0

        mfsr    it0, cps
        const   it1, FZ
        consth  it1, FZ
        andn    it0, it0, it1
        const   it1,(DI|TD)
        consth  it1,(DI|TD)
        or      it0,it1,it0
        mtsr    cps, it0
; fall through to _sigcode

        .extern _a29k_ISR_Handler
        .global _sigcode
_sigcode:

        push    msp, lr1                                ; R stack support
        push    msp, rfb                                ; support
        push    msp, msp                                ; M stack support

;       push    msp, FPStat0                            ; Floating point 0
;       push    msp, FPStat1                            ; Floating point 1
;       push    msp, FPStat2                            ; Floating point 2
;       push    msp, FPStat3                            ; Floating point 3
        sub     msp,msp,4*4

        pushsr  msp, tav, IPA                           ; save user mode special
        pushsr  msp, tav, IPB                           ; save user mode special
        pushsr  msp, tav, IPC                           ; save user mode special
        pushsr  msp, tav, Q                             ; save user mode special

        sub     msp, msp, 29*4                          ; gr96-gr124
        mtsrim  cr, 29-1                                ;
        storem  0, 0, gr96, msp                         ;


        const   v0, WindowSize                          ; Window Size value
        consth  v0, WindowSize                          ; Window Size value
        load    0, 0, v0, v0                            ; load  Window size     
        add     v2, msp, SIGCTX_RAB                     ; intr RAB value        

        load    0, 0, v2, v2                            ; rab value

        sub     v1, rfb, v2                             ;
        cpgeu   v1, v1, v0                              ;
        jmpt    v1, nfill                               ; jmp if spill
        add     v1, gr1, 8                              ;

        cpgtu   v1, v1, rfb                             ; longjump test
        jmpt    v1, nfill                               ;
        nop                                             ;

ifill:
        add     v0, msp, SIGCTX_RAB+4                   ;
        push    v0, rab                                 ;
        const   v2, fill+4                              ;
        consth  v2, fill+4                              ;

        push    v0, v2                                  ; resave PC0
        sub     v2, v2, 4                               ;
        push    v0, v2                                  ; resave PC1
        const   v2, 0                                   ;
        
        sub     v0, v0, 3*4                             ;
        push    v0, v2                                  ;

nfill:
        cpgtu   v0, gr1, rfb                            ; if gr1>rfb -> gr1=rfb 
        jmpt    v0, lower                               ;
        cpltu   v0, gr1, rab                            ;
        jmpt    v0, raise                               ; gr1<rab then gr1=rab
        nop                                             ;

sendsig:
        sub     gr1, gr1, RALLOC                        ;
        asgeu   V_SPILL, gr1, rab                       ;
        add     lr1, rfb, 0                             ;
        add     v1, msp, SIGCTX_SIG                     ;

cont:
        add     lr2,it3,0                               ; signal #
        call    lr0, _a29k_ISR_Handler                  ; call the handler
        nop

        nop                                             ; WASTE
        jmp     _a29k_sigdfl                            ; return code
        nop                                             ; WASTE
        nop                                             ; ALIGN

lower:
        jmp     sendsig                                 ;
        add     gr1, rfb, 0                             ;
raise:
        jmp     sendsig                                 ;
        add     gr1, rab, 0                             ;

        
        .global _a29k_sigdfl_sup
_a29k_sigdfl_sup:
        repair_R_stack                                  ;
        repair_regs                                     ;
        sig_return                                      ; return
        halt                                            ; never executes


        .global _sigret
_sigret:
;assume msp points to tav
        mfsr    it0,cps
        const   it1,FZ
        or      it1,it0,it1
        mtsr    cps,it1
        nop
        nop
_sigret1:
        pop     tav,msp
        popsr   ops,it0,msp
        popsr   alu,it0,msp
        popsr   chc,it0,msp
        popsr   chd,it0,msp
        popsr   cha,it0,msp
        popsr   pc2,it0,msp
        popsr   pc1,it0,msp
        popsr   pc0,it0,msp
        pop     rab,msp
        pop     it0,msp
        add     gr1,it0,0
        add     msp,msp,4       ;discount signal
        iret

_a29k_sigdfl:
        asneq   SIGDFL,gr1,gr1
        jmpi    lr0
        nop

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.