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

Subversion Repositories or1k

[/] [or1k/] [tags/] [tn_m001/] [newlib/] [libgloss/] [sparc/] [traps.S] - Diff between revs 39 and 56

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 39 Rev 56
Line 24... Line 24...
 *  cannot have a full trap table and still have room left over to
 *  cannot have a full trap table and still have room left over to
 *  reprogram the Memory Configuration register correctly.  This file
 *  reprogram the Memory Configuration register correctly.  This file
 *  uses an abbreviated trap which has every entry which might be used
 *  uses an abbreviated trap which has every entry which might be used
 *  before RTEMS installs its own trap table.
 *  before RTEMS installs its own trap table.
 */
 */
        .globl  SYM(trap_table)
        .globl  _trap_table
SYM(trap_table):
_trap_table:
  TRAP(SYM(ercinit));                           ! 00 reset trap
  TRAP(SYM(ercinit));                           ! 00 reset trap
  BAD_TRAP;                                     ! 01 instruction access exception
  BAD_TRAP;                                     ! 01 instruction access exception
  TRAP(SYM(no_fpu));                            ! 02 illegal instruction
  TRAP(SYM(no_fpu));                            ! 02 illegal instruction
  BAD_TRAP;                                     ! 03 privileged instruction
  BAD_TRAP;                                     ! 03 privileged instruction
  BAD_TRAP;                                     ! 04 fp disabled
  BAD_TRAP;                                     ! 04 fp disabled
Line 278... Line 278...
_init:
_init:
        set     PSR_INIT, %g1           ! Initialize psr
        set     PSR_INIT, %g1           ! Initialize psr
        mov     %g1, %psr
        mov     %g1, %psr
        set     WIM_INIT, %g1           ! Initialize WIM
        set     WIM_INIT, %g1           ! Initialize WIM
        mov     %g1, %wim
        mov     %g1, %wim
        set     SYM(trap_table), %g1    ! Initialize TBR
        set     _trap_table, %g1        ! Initialize TBR
        mov     %g1, %tbr
        mov     %g1, %tbr
        nop;nop;nop
        nop;nop;nop
 
 
        set     PSR_INIT, %g1
        set     PSR_INIT, %g1
        wr      %g1, 0x20, %psr         ! enable traps
        wr      %g1, 0x20, %psr         ! enable traps
Line 361... Line 361...
        save    %g0, %g0, %g0
        save    %g0, %g0, %g0
 
 
        jmpl    %l1, %g0
        jmpl    %l1, %g0
        rett    %l2
        rett    %l2
 
 
 
/*
 
 * Register window flush handler, triggered by a "ta 3" instruction.
 
 * We are called with %l0 = wim, %l1 = pc, %l2 = npc
 
 */
        .globl  SYM(win_flush)
        .globl  SYM(win_flush)
SYM(win_flush):
SYM(win_flush):
        set     save_buf, %l0           ! Save %g1 and %g2
        mov     %psr, %l0
        st      %g1,[%l0]
        or      %l0,0xf00,%l3           ! Disable interrupts
        st      %g2,[%l0 + 4]
        mov     %l3,%psr
 
        nop
        mov     %psr, %g1
        nop
        or      %g1, 0x0f00, %g2
        nop
        restore                         ! enter previous frame (cannot trap)
        mov     %wim, %l3
        wr      %g2, 0x20, %psr         ! enable traps, disable interrupts
 
        nop; nop; nop
        srl     %l3, %l0, %l4           ! wim >> cwp
        save                            ! 6 save to flush all windows
        cmp     %l4, 1
        save
        bne     flush_window_fine       ! Branch if not in the invalid window
        save
        nop
        save
 
        save
/* Handle window overflow. We can't trap here. */
        save
 
        restore                         ! 6 restore to enter trapped frame
        mov     %g1, %l4                ! Save g1, we use it to hold the wim
 
        srl     %l3, 1, %g1             ! Rotate wim right
 
        sll     %l3, NUMBER_OF_REGISTER_WINDOWS - 1, %l3
 
        or      %l3, %g1, %g1
 
        mov     %g0, %wim               ! Clear wim so that subsequent save
 
        nop                             !  wont trap
 
        nop
 
        nop
 
        save    %g0, %g0, %g0           ! Slip into next window
 
        mov     %g1, %wim               ! Install the new wim
 
 
 
        std     %l0, [%sp + 0 * 4]      ! save L & I registers
 
        std     %l2, [%sp + 2 * 4]
 
        std     %l4, [%sp + 4 * 4]
 
        std     %l6, [%sp + 6 * 4]
 
 
 
        std     %i0, [%sp + 8 * 4]
 
        std     %i2, [%sp + 10 * 4]
 
        std     %i4, [%sp + 12 * 4]
 
        std     %i6, [%sp + 14 * 4]
 
 
 
        restore                         ! Go back to trap window.
 
        mov     %l4, %g1                ! Restore %g1
 
 
 
flush_window_fine:
 
        mov     %psr,%l5                ! enable traps
 
        or      %l5,0x20,%l5
 
        mov     %l5, %psr
 
        nop
 
        nop
 
        nop
 
 
 
        set     save_buf,%l5
 
        st      %l2,[%l5]
 
 
 
        ! The stack pointer currently contains a bogus value [when a trap
 
        ! occurs CWP is decremented and points to an unused window].
 
        ! Give it something useful before we flush every window.
 
        ! This does what a "save %sp,-64,$sp" would, except that CWP has
 
        ! already been decremented.
 
        add     %fp, -64, %sp
 
 
 
        save %sp, -64, %sp              ! Flush user register window to stack
 
        save %sp, -64, %sp
 
        save %sp, -64, %sp
 
        save %sp, -64, %sp
 
        save %sp, -64, %sp
 
        save %sp, -64, %sp
 
        save %sp, -64, %sp
 
        save %sp, -64, %sp
 
        restore
 
        restore
 
        restore
        restore
        restore
        restore
        restore
        restore
        restore
        restore
        restore
        restore
        restore
 
 
        restore                         ! Make sure we have a valid window
        restore                         ! Make sure we have a valid window
        save %g0, %g0, %g0
        save %g0, %g0, %g0
 
 
        mov      %g1, %psr              ! restore psr
        set     save_buf, %l2           ! Get our return address back
 
        ld      [%l2],%l2
 
 
 
        mov     %psr,%l5                ! disable traps for rett
 
        andn    %l5,0x20,%l5
 
        mov     %l5,%psr
        nop
        nop
        nop
        nop
        nop
        nop
 
 
        set     save_buf, %l0           ! Restore %g1 and %g2
        jmpl    %l2, %g0
        ld      [%l0], %g1
 
        ld      [%l0 + 4], %g2
 
 
 
        jmp  %l2                        ! jump to nPC
 
        rett  %l2 + 4
        rett  %l2 + 4
 
 
/*
/*
 * Read the TBR.
 * Read the TBR.
 */
 */
Line 465... Line 522...
        jmpl    %l2, %g0
        jmpl    %l2, %g0
        rett    %l2+4
        rett    %l2+4
 
 
        .data
        .data
        .align  4
        .align  4
 
        .ascii  "DaTa"
 
        .long   SYM(sdata)
in_trap_handler:
in_trap_handler:
        .word   0
        .word   0
save_buf:
save_buf:
        .word   0        /* place to save %g1 */
        .word   0        /* place to save %g1 */
        .word   0        /* place to save %g2 */
        .word   0        /* place to save %g2 */

powered by: WebSVN 2.1.0

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