📄 entry.s
字号:
mov r0, r1 shll r0 bf/s 1f shll r0 bf/s 1f mov #OFF_PC, r0 ! SP >= 0xc0000000 : gUSA mark mov.l @(r0,r15), r2 ! get user space PC (program counter) mov.l @(OFF_R0,r15), r3 ! end point cmp/hs r3, r2 ! r2 >= r3? bt 1f add r3, r1 ! rewind point #2 mov.l r1, @(r0,r15) ! reset PC to rewind point #2 !1: mov.l 2f, r1 mova SYMBOL_NAME(ret_from_syscall), r0 jmp @r1 lds r0, pr .align 22: .long SYMBOL_NAME(schedule)ret_from_irq:ret_from_exception: mov #OFF_SR, r0 mov.l @(r0,r15), r0 ! get status register shll r0 shll r0 ! kernel space? bt restore_all ! Yes, it's from kernel, go back soon ! bra ret_from_syscall mov #0, r8 ! indicate it's *not* syscall return .align 2syscall_ret: mov.l r0, @(OFF_R0,r15) ! save the return value /* fall through */ENTRY(ret_from_syscall) /* CLI */ stc sr, r0 or #0xf0, r0 ldc r0, sr ! stc k_current, r1 mov.l @(need_resched,r1), r0 tst r0, r0 bf reschedule mov.l @(sigpending,r1), r0 tst r0, r0 bt restore_allsignal_return: mov.l __do_signal, r1 mov r15, r4 mov #0, r5 mov r8, r6 mov r9, r7 mova restore_all, r0 jmp @r1 lds r0, pr .align 2__do_signal: .long SYMBOL_NAME(do_signal)__irq_stat: .long SYMBOL_NAME(irq_stat) .align 2restore_all: mov.l @r15+, r0 mov.l @r15+, r1 mov.l @r15+, r2 mov.l @r15+, r3 mov.l @r15+, r4 mov.l @r15+, r5 mov.l @r15+, r6 mov.l @r15+, r7 ! stc sr, r8 mov.l __blrb_flags, r9 ! BL =1, RB=1 or r9, r8 ldc r8, sr ! here, change the register bank ! mov.l @r15+, r8 mov.l @r15+, r9 mov.l @r15+, r10 mov.l @r15+, r11 mov.l @r15+, r12 mov.l @r15+, r13 mov.l @r15+, r14 mov.l @r15+, k4 ! original stack pointer ldc.l @r15+, spc lds.l @r15+, pr mov.l @r15+, k3 ! original SR ldc.l @r15+, gbr lds.l @r15+, mach lds.l @r15+, macl #ifdef CONFIG_SH_DSP mov.l @r15+, k0 ! DSP mode marker mov.l 5f, k1 cmp/eq k0, k1 ! Do we have a DSP stack frame? bf skip_restore stc sr, k0 ! Enable CPU DSP mode or k1, k0 ! (within kernel it may be disabled) ldc k0, sr mov r2, k0 ! Backup r2 ! Restore DSP registers from stack mov r15, r2 movs.l @r2+, a1 movs.l @r2+, a0g movs.l @r2+, a1g movs.l @r2+, m0 movs.l @r2+, m1 mov r2, r15 lds.l @r15+, a0 lds.l @r15+, x0 lds.l @r15+, x1 lds.l @r15+, y0 lds.l @r15+, y1 lds.l @r15+, dsr ldc.l @r15+, rs ldc.l @r15+, re ldc.l @r15+, mod mov k0, r2 ! Restore r2skip_restore:#endif ! ! ! Calculate new SR value mov k3, k2 ! original SR value mov.l 1f, k1 stc sr, k0 and k1, k0 ! Get current FD-bit mov.l 2f, k1 and k1, k2 ! Mask orignal SR value or k0, k2 ! Inherit current FD-bit ! mov k3, k0 ! Calculate IMASK-bits shlr2 k0 and #0x3c, k0 cmp/eq #0x3c, k0 bt/s 7f shll2 k0 mov g_imask, k0 !7: or k0, k2 ! Set the IMASK-bits ldc k2, ssr !#if defined(CONFIG_KGDB_NMI) ! Clear in_nmi mov.l 4f, k0 mov #0, k1 mov.b k1, @k0#endif mov.l @r15+, k2 ! restore EXPEVT mov k4, r15 rte nop .align 2__blrb_flags: .long 0x300000001: .long 0x00008000 ! FD2: .long 0xffff7f0f ! ~(IMASK+FD)3: .long 0x00080000 ! SZ=0, PR=1#if defined(CONFIG_KGDB_NMI)4: .long SYMBOL_NAME(in_nmi)#endif5: .long 0x00001000 ! DSP! Exception Vector Base!! Should be aligned page boundary.! .balign 4096,0,4096ENTRY(vbr_base) .long 0! .balign 256,0,256general_exception: mov.l 1f, k2 mov.l 2f, k3 bra handle_exception mov.l @k2, k2 .align 22: .long ret_from_exception1: .long EXPEVT!! .balign 1024,0,1024tlb_miss: mov.l 1f, k2 mov.l 4f, k3 bra handle_exception mov.l @k2, k2! .balign 512,0,512interrupt: mov.l 2f, k2 mov.l 3f, k3#if defined(CONFIG_KGDB_NMI) ! Debounce (filter nested NMI) mov.l @k2, k0 mov.l 5f, k1 cmp/eq k1, k0 bf 0f mov.l 6f, k1 tas.b @k1 bt 0f rte nop .align 25: .long NMI_VEC6: .long SYMBOL_NAME(in_nmi)0:#endif /* defined(CONFIG_KGDB_NMI) */ bra handle_exception mov.l @k2, k2 .align 21: .long EXPEVT2: .long INTEVT3: .long ret_from_irq4: .long ret_from_exception!!handle_exception: ! Using k0, k1 for scratch registers (r0_bank1, r1_bank), ! save all registers onto stack. ! stc ssr, k0 ! Is it from kernel space? shll k0 ! Check MD bit (bit30) by shifting it into... shll k0 ! ...the T bit bt/s 9f ! It's a kernel to kernel transition. mov r15, k0 ! save original stack to k0 /* User space to kernel */ mov #0x20, k1 shll8 k1 ! k1 <= 8192 == THREAD_SIZE add current, k1 mov k1, r15 ! change to kernel stack !9: mov.l 3f, k1 !#ifdef CONFIG_SH_DSP mov.l r2, @-r15 ! Save r2, we need another reg stc sr, k4 mov.l 4f, r2 tst r2, k4 ! Check if in DSP mode mov.l @r15+, r2 ! Restore r2 now bt/s skip_save mov #0, k4 ! Set marker for no stack frame mov r2, k4 ! Backup r2 (in k4) for later ! Save DSP registers on stack stc.l mod, @-r15 stc.l re, @-r15 stc.l rs, @-r15 sts.l dsr, @-r15 sts.l y1, @-r15 sts.l y0, @-r15 sts.l x1, @-r15 sts.l x0, @-r15 sts.l a0, @-r15 mov r15, r2 movs.l a1, @-r2 movs.l a0g, @-r2 movs.l a1g, @-r2 movs.l m0, @-r2 movs.l m1, @-r2 mov r2, r15 mov k4, r2 ! Restore r2 mov.l 4f, k4 ! Force DSP stack frameskip_save: mov.l k4, @-r15 ! Push DSP mode marker onto stack#endif ! Save the user registers on the stack. mov.l k2, @-r15 ! EXPEVT ! sts.l macl, @-r15 sts.l mach, @-r15 stc.l gbr, @-r15 stc.l ssr, @-r15 sts.l pr, @-r15 stc.l spc, @-r15 ! lds k3, pr ! Set the return address to pr ! mov.l k0, @-r15 ! save orignal stack mov.l r14, @-r15 mov.l r13, @-r15 mov.l r12, @-r15 mov.l r11, @-r15 mov.l r10, @-r15 mov.l r9, @-r15 mov.l r8, @-r15 ! stc sr, r8 ! Back to normal register bank, and or k1, r8 ! Block all interrupts mov.l 5f, k1 and k1, r8 ! ... ldc r8, sr ! ...changed here. ! mov.l r7, @-r15 mov.l r6, @-r15 mov.l r5, @-r15 mov.l r4, @-r15 mov.l r3, @-r15 mov.l r2, @-r15 mov.l r1, @-r15 mov.l r0, @-r15 ! Then, dispatch to the handler, according to the exception code. stc k_ex_code, r8 shlr2 r8 shlr r8 mov.l 1f, r9 add r8, r9 mov.l @r9, r9 jmp @r9 nop .align 21: .long SYMBOL_NAME(exception_handling_table)3: .long 0x000000f0 ! FD=0, IMASK=154: .long 0x00001000 ! DSP bit set5: .long 0xcfffffff ! RB=0, BL=06: .long 0x00080000 ! SZ=0, PR=1none: rts nop.dataENTRY(exception_handling_table) .long error .long error .long tlb_miss_load .long tlb_miss_store .long initial_page_write .long tlb_protection_violation_load .long tlb_protection_violation_store .long address_error_load .long address_error_store#if defined(__SH4__) .long SYMBOL_NAME(do_fpu_error)#else .long error ! fpu_exception#endif .long error .long system_call ! Unconditional Trap .long error ! reserved_instruction (filled by trap_init) .long error ! illegal_slot_instruction (filled by trap_init)ENTRY(nmi_slot)#if defined (CONFIG_KGDB_NMI) .long debug_enter ! Allow trap to debugger#else .long none ! Not implemented yet#endifENTRY(user_break_point_trap) .long break_point_trapENTRY(interrupt_table) ! external hardware .long SYMBOL_NAME(do_IRQ) ! 0000 .long SYMBOL_NAME(do_IRQ) ! 0001 .long SYMBOL_NAME(do_IRQ) ! 0010 .long SYMBOL_NAME(do_IRQ) ! 0011 .long SYMBOL_NAME(do_IRQ) ! 0100 .long SYMBOL_NAME(do_IRQ) ! 0101 .long SYMBOL_NAME(do_IRQ) ! 0110 .long SYMBOL_NAME(do_IRQ) ! 0111 .long SYMBOL_NAME(do_IRQ) ! 1000 .long SYMBOL_NAME(do_IRQ) ! 1001 .long SYMBOL_NAME(do_IRQ) ! 1010 .long SYMBOL_NAME(do_IRQ) ! 1011 .long SYMBOL_NAME(do_IRQ) ! 1100 .long SYMBOL_NAME(do_IRQ) ! 1101 .long SYMBOL_NAME(do_IRQ) ! 1110 .long error ! Internal hardware .long SYMBOL_NAME(do_IRQ) ! TMU0 tuni0 .long SYMBOL_NAME(do_IRQ) ! TMU1 tuni1 .long SYMBOL_NAME(do_IRQ) ! TMU2 tuni2 .long SYMBOL_NAME(do_IRQ) ! ticpi2 .long SYMBOL_NAME(do_IRQ) ! RTC ati .long SYMBOL_NAME(do_IRQ) ! pri .long SYMBOL_NAME(do_IRQ) ! cui .long SYMBOL_NAME(do_IRQ) ! SCI eri .long SYMBOL_NAME(do_IRQ) ! rxi .long SYMBOL_NAME(do_IRQ) ! txi .long SYMBOL_NAME(do_IRQ) ! tei .long SYMBOL_NAME(do_IRQ) ! WDT iti .long SYMBOL_NAME(do_IRQ) ! REF rcmi .long SYMBOL_NAME(do_IRQ) ! rovi .long SYMBOL_NAME(do_IRQ) .long SYMBOL_NAME(do_IRQ)#if defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7707) || \ defined(CONFIG_CPU_SUBTYPE_SH7709) .long SYMBOL_NAME(do_IRQ) ! 32 IRQ irq0 .long SYMBOL_NAME(do_IRQ) ! 33 irq1 .long SYMBOL_NAME(do_IRQ) ! 34 irq2 .long SYMBOL_NAME(do_IRQ) ! 35 irq3 .long SYMBOL_NAME(do_IRQ) ! 36 irq4 .long SYMBOL_NAME(do_IRQ) ! 37 irq5 .long SYMBOL_NAME(do_IRQ) ! 38 .long SYMBOL_NAME(do_IRQ) ! 39 .long SYMBOL_NAME(do_IRQ) ! 40 PINT pint0-7 .long SYMBOL_NAME(do_IRQ) ! 41 pint8-15 .long SYMBOL_NAME(do_IRQ) ! 42 .long SYMBOL_NAME(do_IRQ) ! 43 .long SYMBOL_NAME(do_IRQ) ! 44 .long SYMBOL_NAME(do_IRQ) ! 45 .long SYMBOL_NAME(do_IRQ) ! 46 .long SYMBOL_NAME(do_IRQ) ! 47 .long SYMBOL_NAME(do_IRQ) ! 48 DMAC dei0 .long SYMBOL_NAME(do_IRQ) ! 49 dei1 .long SYMBOL_NAME(do_IRQ) ! 50 dei2 .long SYMBOL_NAME(do_IRQ) ! 51 dei3 .long SYMBOL_NAME(do_IRQ) ! 52 IrDA eri1 .long SYMBOL_NAME(do_IRQ) ! 53 rxi1 .long SYMBOL_NAME(do_IRQ) ! 54 bri1 .long SYMBOL_NAME(do_IRQ) ! 55 txi1 .long SYMBOL_NAME(do_IRQ) ! 56 SCIF eri2 .long SYMBOL_NAME(do_IRQ) ! 57 rxi2 .long SYMBOL_NAME(do_IRQ) ! 58 bri2 .long SYMBOL_NAME(do_IRQ) ! 59 txi2 .long SYMBOL_NAME(do_IRQ) ! 60 ADC adi#if defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7707) .long SYMBOL_NAME(do_IRQ) ! 61 LCDC lcdi .long SYMBOL_NAME(do_IRQ) ! 62 PCC pcc0i .long SYMBOL_NAME(do_IRQ) ! 63 pcc1i#if defined(CONFIG_CPU_SUBTYPE_SH7300) .long SYMBOL_NAME(do_IRQ) ! 64 .long SYMBOL_NAME(do_IRQ) ! 65 .long SYMBOL_NAME(do_IRQ) ! 66 .long SYMBOL_NAME(do_IRQ) ! 67 .long SYMBOL_NAME(do_IRQ) ! 68 .long SYMBOL_NAME(do_IRQ) ! 69 .long SYMBOL_NAME(do_IRQ) ! 70 .long SYMBOL_NAME(do_IRQ) ! 71 .long SYMBOL_NAME(do_IRQ) ! 72 .long SYMBOL_NAME(do_IRQ) ! 73 .long SYMBOL_NAME(do_IRQ) ! 74 .long SYMBOL_NAME(do_IRQ) ! 75 .long SYMBOL_NAME(do_IRQ) ! 76 .long SYMBOL_NAME(do_IRQ) ! 77 .long SYMBOL_NAME(do_IRQ) ! 78 .long SYMBOL_NAME(do_IRQ) ! 79 .long SYMBOL_NAME(do_IRQ) ! 80 SCIF0(SH7300) .long SYMBOL_NAME(do_IRQ) ! 81 .long SYMBOL_NAME(do_IRQ) ! 82 .long SYMBOL_NAME(do_IRQ) ! 83 .long SYMBOL_NAME(do_IRQ) ! 84 .long SYMBOL_NAME(do_IRQ) ! 85 .long SYMBOL_NAME(do_IRQ) ! 86 .long SYMBOL_NAME(do_IRQ) ! 87 .long SYMBOL_NAME(do_IRQ) ! 88 .long SYMBOL_NAME(do_IRQ) ! 89 .long SYMBOL_NAME(do_IRQ) ! 90 .long SYMBOL_NAME(do_IRQ) ! 91 .long SYMBOL_NAME(do_IRQ) ! 92 .long SYMBOL_NAME(do_IRQ) ! 93
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -